今天,在尝试使用mongodb c ++客户端构建我的lib项目时,我收到了错误:
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../libmongoclient.a(connection_factory.o): relocation R_X86_64_32S against `_ZTVN5mongo17AScopedConnectionE' can not be used when making a shared object; recompile with -fPIC
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../libmongoclient.a: error adding symbols: Bad value
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我用Google搜索了-fPIC,但什么也没得到。我在哪里可以找到关于此的文档?这是什么?我正在使用clang ++进行构建。
答案 0 :(得分:7)
PIC代表职位独立代码。引自man gcc:
如果目标机器支持,则发出与位置无关的代码, 适合动态链接,避免任何大小限制 全球抵消表。
答案 1 :(得分:3)
编译共享库时没有在编译时打开可重定位代码。强烈建议在构建共享库时使用与位置无关的代码(PIC或PIE)。
请参阅http://en.wikipedia.org/wiki/Position-independent_code了解详情。
答案 2 :(得分:2)
可在此处找到非常详细的解释,http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/
答案 3 :(得分:1)
此系统中存在错误,您无法使用module RubyDig
def dig(key, *rest)
if value = (self[key] rescue nil)
if rest.empty?
value
elsif value.respond_to?(:dig)
value.dig(*rest)
end
end
end
end
if RUBY_VERSION < '2.3'
Array.send(:include, RubyDig)
Hash.send(:include, RubyDig)
end
或.o
编译的中间文件生成动态库(xx.so文件),您可以尝试直接使用.cpp或.c文件生成动态库,您也可以看到此链接来修复此错误(link site)