0

我有一个包含 3 个文件的项目。文件 A 是 main.cpp,而另外两个分别包含一个函数(文件 B 包含 FOO(),文件 C 包含 FOO(int, double))。我想做的是链接3个文件,因此文件A中的main()可以调用文件B中的FOO(),它应该调用文件C中的FOO(int,double)。

注意:我没有在我的 C 程序中使用任何特定的头文件。

4

2 回答 2

3

频道:

FOO(int, double);

乙:

#include "C.h"    
FOO();

主.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参数禁止链接。这将创建目标文件。最后,将所有三个目标文件链接到一个可执行文件中

于 2012-06-23T18:18:02.050 回答
0

当您希望软件的“独立”组件相互交互时,您无法摆脱定义接口。在这种情况下,您决定定义组件main.cpp和。要调用,C++ 语言类型规则要求首先存在原型。这至少有两个有用的目的。它允许编译器在编译期间静态检查函数是否传递了正确的参数。它还为编译器提供了足够的信息来有效地管理函数参数(例如,堆栈与寄存器)。大多数时候,接口是在头文件中定义的,因此使用它们应该很自然。B.cppC.cppmain()FOO()B.cpp

有时,软件是使用动态界面开发的。在这种情况下,要调用什么函数是在运行时确定的。、dlopen和调用dlsymdlclose用于实现此目的。一个简单的例子可能是:

// 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 回答