2

我有一个由其他人编写的 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);
}

根据这些说明,这对我来说似乎是正确的,但是当我尝试编译时,我得到:

$ 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 吗?还是与编译命令无关的其他东西?

4

3 回答 3

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.soor libmoveclient.a

g++ helloworld.cpp -L. -lmoveclient

或者如果您正在使用单独的编译:

g++ -c helloworld.cpp
g++ helloworld.o -L. -lmoveclient
于 2012-08-01T05:51:50.400 回答
4

编译命令错误。

通常你会做这样的事情:

gcc -c helloworld.cpp -o helloworld.o
gcc -c moveclient.c -o moveclient.o
gcc    moveclient.o helloworld.o -o helloworld.out

...这将所有对象链接在一起。

于 2012-08-01T05:46:32.330 回答
3

到目前为止,您已正确完成所有操作,但您还需要告诉链接器在哪里可以找到serverConnect. 如果你有一个moveclient.c文件,那么:

gcc helloworld.cpp moveclient.c -o helloworld.out
于 2012-08-01T05:45:53.117 回答