我正在尝试从* .o文件创建.so动态库,并面临以下问题。
LOG:
[nptemp-static]$ gcc -shared *.o -o libexample.so
/usr/bin/ld: bindings_hubbub_parser.o: relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
bindings_hubbub_parser.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
有什么想法吗?我是否需要使用指定的选项重新编译我的整个源代码?
实际上,我不知道我编译的源代码,因为所有的源代码都是开源的,我按照README中的说明下载和编译。
答案 0 :(得分:2)
我正在尝试从* .o文件创建.so动态库,并面临以下问题。
这不是那么简单。在实践中,您应该在创建共享library时编译具体,至少在Linux上。
(也许您可能需要编辑Makefile
或以某种方式配置build automation,如果它不是为构建共享库而设计的;如果构建了一些free software库,则可能会向其作者或社区寻求帮助)
共享库希望拥有position independent code。因此,您需要将源代码with编译为传递给-fPIC
或g++
的{{1}}标记(请参阅this)。您还可以要明确rpath。
阅读Drepper的论文:How To Write Shared Libraries。