我有一个包含3个文件的项目。文件A是main.cpp,而另外两个包含一个函数(文件B包含FOO(),文件C包含FOO(int,double))。我想要做的是链接3个文件,因此文件A中的main()可以调用文件B中的FOO(),它应该在文件C中调用FOO(int,double)。
注意:我没有在我的C程序中使用任何特定的头文件。
答案 0 :(得分:3)
C.h:
FOO(int, double);
B.h:
#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
参数禁止链接。这会创建目标文件。最后,您将链接所有三个目标文件放在一起成为可执行文件。
答案 1 :(得分:0)
当您希望软件的“独立”组件相互交互时,您无法摆脱定义界面。在这种情况下,您决定定义组件main.cpp
,B.cpp
和C.cpp
。要让main()
在FOO()
中调用B.cpp
,C ++语言类型规则要求首先存在原型。这至少有两个有用的目的。它允许编译器在编译期间静态检查函数是否传递了正确的参数。它还为编译器提供了足够的信息来有效地管理函数参数(例如,堆栈与寄存器)。大多数情况下,接口是在头文件中定义的,因此使用它们应该很自然。
有时,软件是使用动态界面开发的。在这种情况下,在运行时确定要调用的函数。可以使用dlopen
,dlsym
和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; }