我一直在使用C编写代码,编译和链接我的代码到存档库(.a文件)时没有任何问题。但是,现在我需要切换到C ++并且这样做,我必须使用g ++而不是cc进行链接和编译。
使用C,首先要做的是编译源代码并创建目标文件,然后使用相同的命令将其链接到库但没有-c选项:
cc -c -ggdb -Wall -Werror -I.. test.c -o test.o
cc -o test -ggdb -Wall -Werror test.o ../libpmem/libpmem.a
我认为应该用g ++做同样的事情,我尝试改变编译和链接阶段如下:
g++ -c -ggdb -Wall -Werror -I.. test.c -o test.o
g++ test.o -I.. -L/path/libpmem -lpmem -o test
虽然两个集合都应该做同样的事情,但在尝试使用g ++进行链接时总是会出错。以下是错误消息:
test.o: In function `main':
/path/test/test.c:5: undefined reference to `pmem_msync_mode()'
collect2: ld returned 1 exit status
make: *** [all] Error 1
链接阶段一定有问题,因为必须在库文件中找到方法定义(正如cc链接器可以找到定义并进行链接而没有任何问题)。
我还尝试使用单个g ++命令进行链接和编译,但无论我做什么,我总是得到相同的错误。知道如何解决这个问题?
答案 0 :(得分:2)
你可能有某种名称错位问题......
因为它看起来像是在c库中声明的,所以应该已经存在某种
#ifdef __cplusplus
extern "C" {
#endif
int pmem_msync_mode();
#ifdef __cplusplus
}
#endif
但如果库标题中没有,您可能需要执行类似的操作;
extern "C" {
#include <pmem.h>
}
答案 1 :(得分:1)
请参阅http://www.cplusplus.com/forum/general/1143/
您需要告诉编译器代码编译为C
答案 2 :(得分:1)
我假设pmem
库已编译并链接为C代码。
C和C ++对于如何以二进制格式存储函数名称有不同的约定。请参阅http://en.wikipedia.org/wiki/Name_mangling以获取参考。
要解决您的问题,可能解决方法是:
extern "C" {
#include <pmem.h>
}
当C ++编译器从头部导入函数声明时,如果没有指定外部C链接,它期望它链接的二进制文件具有不同格式的关联函数表示,即C ++编译器破坏函数名称的任何格式到。