使用gcc构建共享库

时间:2010-08-27 22:12:31

标签: c++ gcc shared-libraries

2 个答案:

答案 0 :(得分:9)

这里有一些错误:

libshared.so为空

你的Makefile实际上并没有在shared.o中链接,它只是创建一个空的共享库。 改变

g++ -g -ggdb -fPIC -rdynamic -shared -Lstatic -lstatic -o shared/libshared.so 

g++ -g -ggdb -fPIC -rdynamic -shared -Lstatic -o shared/libshared.so shared/shared.o -lstatic

-ststatic必须在shared / shared.o之后,因为你必须以它们的依赖项的相反顺序指定静态库。

共享库中的所有目标文件都需要

-fPIC

您创建一个链接在静态库中的共享库。该静态库也必须使用-fPIC进行编译,否则您将创建一个共享库,其中某些部分无法重定位。变化

g++ -g -ggdb -c static/static.cpp -o static/static.o

g++ -fPIC -g -ggdb -c static/static.cpp -o static/static.o

C ++符号被破坏

当您从C ++代码创建共享库时,函数名称和类似函数获取mangeled 这意味着没有与您尝试动态加载的字符串“function_inside_static_lib”匹配的函数名称。在静态库上运行nm,你会看到它实际命名为“_Z26function_inside_static_libii”。您可以运行nm -C来打印C ++名称。

这意味着您在app.cpp中的代码必须是:

 function_inside_shared_lib = (int (*)(int, int))dlsym(handle, "_Z26function_inside_static_libii");

如果您想动态(dlopen)从共享库中获取内容,这通常是使用C而不是C ++从共享对象导出函数的原因之一。过去C ++名称的变形从编译器到编译器各不相同,尽管现在它们似乎已经同意了一个不会改变的标准。使用C语言更简单,共享库中的符号与源代码中的符号相同。

答案 1 :(得分:2)

因此,在步骤2中,您不指定shared.o。所以,而不是:

g++ -g -ggdb -fPIC -rdynamic -shared -L ../static -lstatic -o libshared.so

你应该这样做:

g++ -g -ggdb -fPIC -rdynamic -shared -L ../static shared.o -lstatic -o libshared.so

同样重要的是shared.o在-lstatic之前。否则,链接器将找不到该函数并让它“未定义”。