我有一个由其他人编写的C库,我希望从我的C ++程序中调用它。 C头的结构如下:
#ifndef INC_MOVE_CLIENT_H
#define INC_MOVE_CLIENT_H
#ifdef __cplusplus
extern "C" {
#endif
...
int serverConnect(const char *, const char *, MoveStateDeferred *);
...
#ifdef __cplusplus
}
#endif
#endif // ... INC_MOVE_CLIENT_H
我在我的C ++程序中调用serverConnect,如下所示:
#include "helloworld.h"
#include "moveclient.h"
int main(int argc, const char* argv[]) {
const char* ip = "192.168.1.2";
const char* port = "7899";
MoveStateDeferred* m;
serverConnect(ip, port, m);
}
根据these instructions,这对我来说似乎是正确的,但当我尝试编译时,我得到:
$ gcc helloworld.cpp -o helloworld.out
/tmp/ccuS93Yu.o: In function `main':
helloworld.cpp:(.text+0x3c): undefined reference to `serverConnect'
collect2: ld returned 1 exit status
moveclient.c具有serverConnect的实现,并且与其他文件位于同一目录中。我使用不正确的命令进行编译吗?有什么我需要这样做,以便moveclient.c也被编译?或者它是否与编译commadn无关?
答案 0 :(得分:6)
这不是编译问题,而是一个链接问题。
假设moveclient.c
是您需要的唯一附加文件,那么您有几个选项:
您可以将.c文件添加到编译行:
g++ helloworld.cpp moveclient.c -o helloworld.out
或者您可以将.c(和您的.cpp)文件编译为目标文件并链接它们
g++ -c helloworld.cpp
gcc -c moveclient.c
g++ helloworld.o moveclient.o -o helloworld.out
或者您可以将moveclient内容链接到库中并将该库添加到链接中。
创建库的详细信息取决于您的系统以及是否需要共享库或动态库。但是一旦你有了库,你的构建线就会是这样的(假设你的库被称为libmoveclient.so
或libmoveclient.a
)
g++ helloworld.cpp -L. -lmoveclient
或者如果你正在使用单独的编译:
g++ -c helloworld.cpp
g++ helloworld.o -L. -lmoveclient
答案 1 :(得分:4)
编译命令错误。
通常你会这样做:
gcc -c helloworld.cpp -o helloworld.o
gcc -c moveclient.c -o moveclient.o
gcc moveclient.o helloworld.o -o helloworld.out
...这将所有对象链接在一起。
答案 2 :(得分:3)
到目前为止,您已经完成了所有操作,但您还需要告诉链接器在哪里找到serverConnect
的实现。如果您有moveclient.c
个文件,那么:
gcc helloworld.cpp moveclient.c -o helloworld.out