我尝试使用共享库。
详细说明,我关注此链接: 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 ++。
非常感谢。
答案 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
希望这有帮助。