【发布时间】: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
)
【问题讨论】: