0

3 つのファイルを持つプロジェクトがあります。ファイル A は main.cpp ですが、他の 2 つのファイルにはそれぞれ関数が含まれています (ファイル B には FOO() が含まれ、ファイル C には FOO(int, double) が含まれています)。私がやりたいことは、ファイル A の main() がファイル B の FOO() を呼び出すことができるように 3 つのファイルをリンクすることです。これは、ファイル C の FOO(int, double) を呼び出す必要があります。

注: ここでは、C プログラムで特定のヘッダー ファイルを操作していません。

4

2 に答える 2

3

チャンネル:

FOO(int, double);

Bh:

#include "C.h"    
FOO();

main.cpp:

#include "B.h"

コンパイルするコマンド:

g++ -I. -c main.cpp
g++ -c B.cpp C.cpp
g++ -o final_executable main.o B.o C.o

基本的に、最初に呼び出したい関数のプロトタイプを提供します。次に、B、C、および main をコンパイルします (ただし、それらのいずれもリンクしません) -c。引数はリンクを禁止します。これにより、オブジェクト ファイルが作成されます。最後に、3 つのオブジェクト ファイルすべてを実行可能ファイルにリンクします。

于 2012-06-23T18:18:02.050 に答える
0

ソフトウェアの「独立した」コンポーネントが相互に対話したい場合、インターフェースを定義することから逃れることはできません。この場合、コンポーネントmain.cppB.cppおよびを定義することにしましC.cppた。main()が を呼び出すFOO()にはB.cpp、C++ 言語の型規則により、最初にプロトタイプが存在する必要があります。これは、少なくとも 2 つの有用な目的に役立ちます。これにより、コンパイラは、コンパイル時に関数に正しい引数が渡されていることを静的にチェックできます。また、関数の引数を効率的に管理するのに十分な情報をコンパイラに提供します (たとえば、スタックとレジスタ)。ほとんどの場合、インターフェイスはヘッダー ファイルで定義されるため、自然に使用できるはずです。

動的インターフェースを使用してソフトウェアが開発されることがあります。この場合、呼び出される関数は実行時に決定されます。、dlopendlsymおよびdlclose呼び出しを使用して、これを実現できます。簡単な例は次のとおりです。

// main.cpp
int main () {
    void *dh = dlopen(0, RTLD_LAZY);
    void (*B_FOO_PTR)(void)
        = *static_cast<void (**)(void)>(dlsym(dh, "B_FOO_PTR"));
    dlcose(dh);
    B_FOO_PTR();
}

// B.cpp
static void FOO () {
    void *dh = dlopen(0, RTLD_LAZY);
    void (*C_FOO_PTR)(int, double)
        = *static_cast<void (**)(int, double)>(dlsym(dh, "C_FOO_PTR"));
    dlcose(dh);
    C_FOO_PTR(0, 1.0);
}

extern "C" { void (*B_FOO_PTR)(void) = &FOO; }

// C.cpp
static void FOO (int, double) {
    //...
}

extern "C" { void (*C_FOO_PTR)(int, double) = &FOO; }
于 2012-06-25T08:11:28.870 に答える