【问题标题】:Linker settings链接器设置
【发布时间】:2011-03-11 18:40:44
【问题描述】:

我正在尝试将 boost.python 与我在 cmake 构建系统中的应用程序链接。 我的 CMakeList.txt 中最重要的部分:

set(Boost_USE_STATIC_LIBS OFF)
set(Boost_USE_MULTITHREADED ON)
set(Boost_USE_STATIC_RUNTIME OFF)

find_package(Boost COMPONENTS filesystem system date_time python REQUIRED)

add_definitions(-Wall -g -msse2 -fPIC)

当然,包括/链接 boost 和 python 的库/头文件。

现在失败了:

/usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
libboost_python.a: could not read symbols: Bad value

我决定去cmake临时构建文件夹,找到生成的目标文件(*.o)。 我已经为它应用了命令:

g++ -shared FILE.cpp.o -L/usr/lib -lboost_python -o MyModule.so

因此,我得到了适用于 python 的可行 MyModule 模块!所以,让我们看看 cmake 链接器字符串并找出不同之处。我使用 VERBOSE=1 运行 make:

/usr/bin/c++  -fPIC -g  -shared -Wl,-soname,libScript.so -o ../../lib/libScript.so CMakeFiles/LogManagerWrapper.cpp.o -Wl,-Bstatic -lboost_filesystem -lboost_system -lboost_date_time -lboost_python -Wl,-Bdynamic -lpython2.7 

在排除链接器标志的某些部分时,我发现我的问题出在 -Wl,-Bstatic 中,在 boosts 的库列表之前。

我想知道这个论点是从哪里来的,因为我注意到 CMakeList.txt 中的 Boost_USE_STATIC_LIBS OFF

怎么了?

【问题讨论】:

    标签: c++ python boost linker cmake


    【解决方案1】:

    您没有展示使用 Boost 库的代码,所以我认为它只是:

    target_link_libraries(foo ${Boost_LIBRARIES})
    

    可以补充一下吗

    message("XXX ${Boost_LIBRARIES}")
    

    围绕那个点?我怀疑这会打印一个带有 .a 扩展名的库列表,然后 CMake 会将其转换为 -Wl,-Bstatic -lxxx。检查 .a 库所在的路径并检查是否有 .so 对应项。我的猜测是您实际上只构建了静态库。

    【讨论】:

    • 我查过了。两者都有:a 和 so。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多