【问题标题】:CMake link issue with relocated libraries重定位库的 CMake 链接问题
【发布时间】:2019-03-27 09:50:38
【问题描述】:

我有一系列库 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
)

【问题讨论】:

  • 你能在这两种情况下显示你用来构建库和可执行文件的命令,什么时候有效,什么时候不有效?
  • “可重新定位”是什么意思?您的 makefile 应该具有查找库的路径,并且您必须将其提供给链接命令。库的所需对象被提取并组合到可执行文件中。
  • @Bodo 我使用 cmake 生成 cygwin makefile 并简单地使用 make 命令构建和 make install 导出到我的存储库
  • @Darkiwi 你应该edit你的问题添加澄清。显示 CMakeLists.txt 文件并显示您的工作区的外观可能会很好。
  • @Darkiwi 不要在 cmets 中回答,edit您的问题以添加更多信息。

标签: c cmake linker


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-10-21
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多