什么是-fPIC编译选项?

时间:2013-12-09 06:10:34

标签: c++

今天,在尝试使用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 ++进行构建。

4 个答案:

答案 0 :(得分:7)

PIC代表职位独立代码。引自man gcc:

  

如果目标机器支持,则发出与位置无关的代码,   适合动态链接,避免任何大小限制   全球抵消表。

答案 1 :(得分:3)

编译共享库时没有在编译时打开可重定位代码。强烈建议在构建共享库时使用与位置无关的代码(PIC或PIE)。

请参阅http://en.wikipedia.org/wiki/Position-independent_code了解详情。

答案 2 :(得分:2)

答案 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)