/ usr / bin / C ++无法使用共享库编译为gcc

时间:2016-12-14 07:16:00

标签: c++ c linux gcc shared-libraries

我尝试使用共享库。

详细说明,我关注此链接: http://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html

使用此命令一切正常:

<a ng-href="/#/list/{{data._id}}">LIST</a>

但是当我从gcc更改为/ usr / bin / c ++时,ANd将命令更改为:

$ gcc -L/home/user/foo -Wl,-rpath=/home/user/foo -Wall -o test main.c -lfoo
$ ./test

在我的libfoo.so中找不到方法foo。

我也尝试用另一种方式使用-rdynamic,它也适用于gcc:

$ /usr/bin/c++ -L/home/user/foo -Wl,-rpath=/home/user/foo -Wall -o test2 main.c -lfoo
/tmp/ccpEHbNV.o: In function `main':
main.c:(.text+0x16): undefined reference to `foo()'
collect2: error: ld returned 1 exit status

但是/ usr / bin / c ++也有同样的错误。

请告诉我如何使用/ usr / bin / c ++。

非常感谢。

3 个答案:

答案 0 :(得分:2)

正如其他人所说,这是因为C和C ++编译库之间的符号命名不同,因为C ++有重载函数,每个符号的命名应该包括符号名称中的参数类型或者标识基于实际函数或类方法的东西。它的论点。 与C ++不同,C没有这个问题,因为没有函数重载和它的标准ABI。如果你想要混合C / C ++文件,你必须编译所有的C&amp; C带有g ++的C ++代码,还可以在C代码的定义中添加extern C关键字

#ifdef __cplusplus
extern "C" {
#endif

// your C definitions (only function definitions) goes here

#ifdef __cplusplus
}
#endif

答案 1 :(得分:1)

问题来了,可能是因为C ++的名称错误。 / usr / bin / c ++最终为/ usr / bin / g ++。 gcc是一个C编译器,而g ++是一个C ++编译器。您需要使用g ++编译库libfoo.so,然后尝试链接。它应该工作。

答案 2 :(得分:-1)

您正在使用的gcc和c ++的版本是什么?

理想情况下,在相同的编译器工具链系列中,应该没有错误。

事实上,我编写了代码,编译并执行了相同的示例而没有任何问题。

请注意我正在使用的gcc / c ++版本。

gcc (GCC) 6.2.1 20160830
g++ (GCC) 6.2.1 20160830

我写了一个shell脚本文件来执行命令

strace c++ -c -Wall -Werror -fpic foo.c
strace c++ -shared -o libfoo.so foo.o
strace c++ -L. -Wall -o test main.c -lfoo

并收集编译和链接的strace输出。请参阅下面的链接 http://pastebin.com/nJpQuCfS

希望这有帮助。