从cc编译器切换到g ++编译器时出现链接器错误

时间:2013-12-27 07:12:32

标签: c++ c compiler-construction linker

我一直在使用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 ++命令进行链接和编译,但无论我做什么,我总是得到相同的错误。知道如何解决这个问题?

3 个答案:

答案 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 ++编译器破坏函数名称的任何格式到。