CMake链接库搬迁问题

时间:2019-03-27 09:50:38

标签: 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
)

1 个答案:

答案 0 :(得分:0)

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

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