在构建CMake项目的其余部分之前,先安装预构建的库,并将目标链接到已安装的版本



我打算提供一个目录,其中包含一个CMake项目,该项目构建一些C++代码,这些代码依赖于CMake工程附带的预构建静态库。

我希望CMake通过首先将预构建的库安装到默认位置(例如/usr/local/lib(来构建项目,然后再构建其他目标,使其链接到库的已安装版本,而不是构建树中的副本。

如何做到这一点?

编辑:我可以从回复中看出,这不是应该做的。

我考虑这一点的原因是,我首先尝试在构建步骤中链接到构建树中的副本,但当我安装可执行文件时,链接器找不到库,除非从同一目录调用execeutable。我想我还需要将库安装到标准位置,但也许我需要做的是强制一些路径变量是绝对的而不是相对的,或者我缺少的其他东西?以下是最小CMakeLists.txt示例:

include_directories("${CMAKE_SOURCE_DIR}") # source code here
link_directories("${CMAKE_SOURCE_DIR}")    # libmylib.a here
add_executable(my_target my_target.cpp)
target_link_libraries(my_target PRIVATE mylib)
install(TARGET my_target RUNTIME DESTINATION bin ARCHIVE DESTINATION lib CONFIGURATIONS Release)

构建和安装后,我可以从任何地方运行my_target(因为它已安装到/usr/local/lib(,但除非我从CMAKE_SOURCE_DIR调用它,否则它会立即退出,并显示以下错误消息:

libc++abi: terminating with uncaught exception of type std::runtime_error: No such file libmylib.a
Abort trap: 6

如果它是静态的,为什么要安装它(@Stephen Newell怎么说的(?使用add_library(my_prebuilt_lib STATIC IMPORTED),将库的IMPORTED_LOCATION设置为构建树中它所在的位置,并与之链接。

如果您希望其他也静态链接到该库,您仍然可以安装该库,但在您自己的构建中不需要这样做。

最新更新