【问题标题】:Getting error "can not be used when making a shared object; recompile with -fPIC" although fpic is used尽管使用了 fpic,但出现错误“在创建共享对象时无法使用;使用 -fPIC 重新编译”
【发布时间】:2019-08-30 12:34:28
【问题描述】:

我目前正在从 cmake 环境中构建一个共享库 (lib1.so)。 lib1.so 依赖于外部静态库 libLASlib.a(如果需要,我可以重新编译)。 到目前为止,一切都在 Windows 上运行得很好,但切换到 linux 时就另当别论了:

/usr/bin/ld: lib/LASlib/libLASlib.a(lasreader.cpp.o): relocation R_X86_64_PC32 against symbol `_ZN9LASreader35read_point_filtered_and_transformedEv' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

所以我尝试使用 -fPIC 重新编译 libLASlib -> 相同的错误

由于我的环境,我无法验证 fpic 是否有效地添加到 gcc 命令行中。

这是我试图确认 fPIC 没有问题的内容:

readelf --dynamic libLASlib.a | grep lasreader.cpp.o -A2
File: libLASlib.a(lasreader.cpp.o)

There is no dynamic section in this file.

据记录,没有找到带有动态部分的单个 cpp.o

我只是想看看如果我将 liblas 从静态库更改为共享库会得到什么 -> 没有错误

有什么想法吗? 非常感谢!

【问题讨论】:

    标签: c++ linux gcc libraries


    【解决方案1】:

    你需要编译lasreader.cpp-fPIC。像这样的:

    g++ -c -fPIC -o lasreader.cpp.o lasreader.cpp

    【讨论】:

    • 如前所述,我已经用 -fPIC 编译了整个 libLASlib.a(lasreader.cpp 是其中的一部分)如果我没记错的话,“文件:libLASlib.a(lasreader.cpp.o)此文件中没有动态部分。”应该意味着PIC标志没有问题吧?
    • 像我展示的那样手动编译它,然后使用目标文件手动创建 lib 以验证它不是您的 cmake 设置导致问题。每当我遇到该错误时,都不是使用 fPIC 创建目标文件
    • 感谢指出,fPIC 确实没有应用(柯南似乎没有转发 fPIC 选项)我编辑了 CMAKELIST 并添加了“set_property(TARGET LASlib PROPERTY POSITION_INDEPENDENT_CODE ON)”—— ---> 对我有用 不能赞成你的答案,因为我是这个网站的最近用户对不起:/
    • 别担心,但请阅读“What should I do when someone answers my question?”。 :-)
    【解决方案2】:

    fPIC 确实没有应用

    柯南似乎没有转发 fPIC 选项

    我编辑了 CMAKELIST 并添加了

    set_property(TARGET LASlib PROPERTY POSITION_INDEPENDENT_CODE ON)
    

    它最终通过了

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-22
      • 2018-03-31
      • 1970-01-01
      • 2018-05-14
      相关资源
      最近更新 更多