CMake 与重新定位的库的链接问题

标签 c cmake linker

我有一系列库 A、B、C,其中 B 依赖于 A,C 依赖于 A 和 B。

我有一个最终的库 D 和一个使用它的可执行文件。 D 取决于 A、B 和 C。

一次构建每个库并将其导出到本地存储库时,一切都很好:D 构建、链接和可执行文件工作正常。 当手动将包含 A、B、C 的存储库复制到另一个位置(并从该其他位置导入到 D)时,结果是可变的:

  • 在 Windows (Visual Studio) 上一切正常,

  • Cygwin 上存在运行时问题。

问题如下:

  • D 构建和链接,

  • 运行可执行文件时,它立即崩溃,

  • 当使用“ldd”命令检查 D 时,它显示了奇怪的东西

:

??? => ??? (0x53a570000)

??? => ??? (0x180040000)

我试图让我的库可重新定位,但似乎我错过了一些东西...... 但在导出的目标文件中,没有绝对路径。

我在 google 上看到过一些关于 SO_NAME 的内容,因此我在导入 A、B 和 C 后在 D 中尝试了此操作:

set_property(TARGET A PROPERTY IMPORTED_NO_SONAME 1)

但并没有解决问题。

我迷路了,有人可以帮助我吗?

编辑:

A的导出代码:

# Library
add_library(mylibA SHARED
    ${SOURCE_FILES}
    ${PUBLIC_HEADERS}
)
set_target_properties(mylibA PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
    INTERFACE_LINK_LIBRARIES mylibA
)
target_include_directories(mylibA
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes>
        $<INSTALL_INTERFACE:include>
)
target_link_libraries(mylibA)

# Packaging
if(ENABLE_MYLIBA_PACKAGING)
    # Install target to export
    install(TARGETS mylibA
        EXPORT mylibA-export
        LIBRARY DESTINATION "bin"
        ARCHIVE DESTINATION "bin"
        RUNTIME DESTINATION "bin"
        PUBLIC_HEADER DESTINATION "include/mylibA"
    )
    # Install export
    install(EXPORT mylibA-export
        FILE mylibATargets.cmake
        CONFIGURATIONS Debug|Release
        DESTINATION "cmake"
    )
    # Install config file
    install(FILES mylibAConfig.cmake
        CONFIGURATIONS Debug|Release
        DESTINATION "cmake"
    )
    export(PACKAGE mylibA)
endif()

在D的cmake中导入代码:

# Import
find_package(mylibA PATHS ${REPO_PATH})
find_package(mylibB PATHS ${REPO_PATH})
find_package(mylibC PATHS ${REPO_PATH})

# Library
add_library(mylibD SHARED
  ${SOURCE_FILES}
  ${CONFIG_HEADERS}
  ${PUBLIC_HEADERS}
)
set_target_properties(mylibD PROPERTIES
    PUBLIC_HEADER "${PUBLIC_HEADERS}"
)
target_include_directories(mylibD
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/../inc>
        $<BUILD_INTERFACE:${mylibA_INCLUDE_DIR}>
)
target_link_libraries(mylibD
    PUBLIC mylibA
    PUBLIC mylibB
    PUBLIC mylibC
)

最佳答案

Cygwin 问题来自访问权限:在 Windows 中复制文件会在 cygwin 中设置“默认”非常受限的访问权限,从而导致所描述的运行时问题。

我在复制之后/构建和链接之前在 cygwin 中使用了 chmod,它解决了问题。

关于CMake 与重新定位的库的链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55374218/

相关文章:

c - 预期错误 : ,

c - 无法从 Linux 中的设备驱动程序调用 Fork()

python - 使用 Boost/python.hpp 的 CMake 编译 c++ 程序

c++ - g++ 5.5 不链接共享库

c++ - 如何防止 VC++ 9 链接器链接不必要的全局变量?

C程序函数错误

c - 通过引用将双数组从 C 传递到 Delphi DLL

c++ - Visual C++ 2010 错误。运行 LibICP 时系统找不到指定的文件

cmake - 让 CMake 设置 CTtest 以在单个测试的输出周围打印页眉和页脚

compiler-errors - 链接 uWSGI 时出错