C++ CMake导出具有绝对路径的目标

C++ CMake导出具有绝对路径的目标,c++,boost,cmake,C++,Boost,Cmake,我正在开发一个静态库,我正在使用CMake。这个图书馆需要加强。因此,我做了以下工作: set(LIBRARY_NAME "MyLib") set(LIBRARY_VERSION 1.0.0) project(${LIBRARY_NAME} VERSION ${LIBRARY_VERSION}) set(Boost_USE_STATIC_LIBS ON) set(Boost_USE_MULTITHREADED ON) find_package(Boost COMPONENTS syste

我正在开发一个静态库,我正在使用CMake。这个图书馆需要加强。因此,我做了以下工作:

set(LIBRARY_NAME "MyLib")
set(LIBRARY_VERSION 1.0.0)
project(${LIBRARY_NAME} VERSION ${LIBRARY_VERSION})

set(Boost_USE_STATIC_LIBS   ON)
set(Boost_USE_MULTITHREADED ON) 
find_package(Boost COMPONENTS system filesystem regex thread date_time log log_setup REQUIRED)
include_directories(${Boost_INCLUDE_DIR})
link_directories(${Boost_LIBRARY_DIR})

add_library(${LIBRARY_NAME} STATIC xx.cpp)

target_link_libraries(${LIBRARY_NAME} PUBLIC ${Boost_LIBRARIES})
到目前为止一切都很好

现在,我需要使这个库可以安装。因此,我遵循本教程

在我的机器上一切看起来都很好。然而,当我将已安装的文件(通过调用makeinstall生成的文件)移动到另一台机器上并尝试使用find_包(MyLib)时,出现了一个问题,即它可以在我原来机器上的某个位置找到boost。我深入到MyLibTargets.cmake文件中,看到了Boost库的绝对路径


为什么会这样?如何防止这种情况发生?

如果您从另一台机器上获取cmake构建目录并使用它,这将无法工作。cmake不支持来自同一工作目录的不同平台


为此,您需要使用源代码外版本。但是,一旦您使用cmake进行了就地构建,目录就会被烧掉,并且源代码外构建不再适用于此源代码树。在这种情况下,您需要删除所有cmake临时文件和文件夹以使源代码树再次工作。

您应该澄清“将已安装的文件移动到另一台计算机”的含义。@Marcel调用make install生成的文件
为什么会发生这种情况?
-因为
查找包(Boost)
设置boost库的绝对路径,因此CMake打包机制将这些路径存储到用于搜索包的
.CMake
脚本中
如何防止这种情况发生?
-手动编写
MyLibConfig.cmake
(或其包含的文件,如
MyLibTargets.cmake
)。至于更简单的方法。。。你想告诉CMake Boost安装在标准位置,由链接器(库不需要完整路径)和编译器(包括目录不需要完整路径)自动搜索,不是吗?@Tsyvarev非常感谢。非常有帮助,谢谢。实际上,我没有移动构建目录。我移动了生成安装的文件。