我有一个级联的库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
)
答案 0 :(得分:0)
Cygwin问题来自访问权限:在Windows中复制文件将cygwin中的访问权限设置为“默认”非常有限,这导致了所描述的运行时问题。
在复制/之后,我在cygwin中使用了chmod,在构建和链接之前,它解决了问题。