在 CMakeLists 中使用相对路径引用动态库

问题描述 投票:0回答:1

我有一个项目使用了一些动态库。生成的可执行文件在我的本地机器上运行良好。但是,如果我将它分享给其他人,可执行文件仍然会尝试在我的本地机器上寻找具有 absolute 路径的动态库,这在其他机器上当然不存在。如何通过更改 CMakeLists 来解决此问题?

我当前的 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.24)
project(MyProject)
link_directories("libs/mac_arm64")
add_executable(MyProject main.cpp)
target_link_libraries(MyProject expat bz2 z geos_c)
c++ c cmake dll
1个回答
0
投票

参见 CMake 文档中关于创建可重定位包的部分

理想情况下,此类依赖项应通过自己的 IMPORTED 目标 使用,这些目标具有自己的

IMPORTED_LOCATION
和使用要求属性,例如
INTERFACE_INCLUDE_DIRECTORIES
适当填充。然后可以将这些导入的目标与 ClimbingStats 的
target_link_libraries()
命令一起使用:

target_link_libraries(ClimbingStats INTERFACE Foo::Foo Bar::Bar)

使用这种方法,包仅通过 IMPORTED 目标 的名称引用其外部依赖项。当消费者使用已安装的包时,消费者将运行适当的

find_package()
命令(通过上述的 find_dependency 宏)来查找依赖项并在自己的机器上使用适当的路径填充导入的目标。

不幸的是,许多 CMake 附带的

modules
尚未提供 IMPORTED 目标,因为它们的开发早于这种方法。随着时间的推移,这可能会逐渐改善。使用此类模块创建可重定位包的解决方法包括:

  • 构建包时,将每个 Foo_LIBRARY 缓存条目指定为库名称,例如-DFoo_LIBRARY=富。这告诉相应的查找模块只用 foo 填充 Foo_LIBRARIES 以要求链接器搜索库而不是硬编码路径。

  • 或者,在安装包内容之后但在创建用于重新分发的包安装二进制文件之前,手动将绝对路径替换为占位符,以便在安装包时由安装工具替换。

© www.soinside.com 2019 - 2024. All rights reserved.