我有一个项目使用了一些动态库。生成的可执行文件在我的本地机器上运行良好。但是,如果我将它分享给其他人,可执行文件仍然会尝试在我的本地机器上寻找具有 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)
理想情况下,此类依赖项应通过自己的 IMPORTED 目标 使用,这些目标具有自己的
和使用要求属性,例如IMPORTED_LOCATION
适当填充。然后可以将这些导入的目标与 ClimbingStats 的INTERFACE_INCLUDE_DIRECTORIES
命令一起使用:target_link_libraries()
target_link_libraries(ClimbingStats INTERFACE Foo::Foo Bar::Bar)
使用这种方法,包仅通过 IMPORTED 目标 的名称引用其外部依赖项。当消费者使用已安装的包时,消费者将运行适当的
命令(通过上述的 find_dependency 宏)来查找依赖项并在自己的机器上使用适当的路径填充导入的目标。find_package()
尚未提供 IMPORTED 目标,因为它们的开发早于这种方法。随着时间的推移,这可能会逐渐改善。使用此类模块创建可重定位包的解决方法包括:modules
构建包时,将每个 Foo_LIBRARY 缓存条目指定为库名称,例如-DFoo_LIBRARY=富。这告诉相应的查找模块只用 foo 填充 Foo_LIBRARIES 以要求链接器搜索库而不是硬编码路径。
或者,在安装包内容之后但在创建用于重新分发的包安装二进制文件之前,手动将绝对路径替换为占位符,以便在安装包时由安装工具替换。