我正在尝试使用 CMake 让跨平台构建系统工作。现在该软件有一些依赖项。我自己编译它们并将它们安装在我的系统上。
已安装的一些示例文件:
-- Installing: /usr/local/share/SomeLib/SomeDir/somefile -- Installing: /usr/local/share/SomeLib/SomeDir/someotherfile -- Installing: /usr/local/lib/SomeLib/somesharedlibrary -- Installing: /usr/local/lib/SomeLib/cmake/FindSomeLib.cmake -- Installing: /usr/local/lib/SomeLib/cmake/HelperFile.cmake
现在 CMake 有一个find_package()打开一个Find*.cmake文件并在系统上搜索库并定义一些变量SomeLib_FOUND等变量。
find_package()
Find*.cmake
SomeLib_FOUND
我的 CMakeLists.txt 包含如下内容:
set(CMAKE_MODULE_PATH "/usr/local/lib/SomeLib/cmake/;${CMAKE_MODULE_PATH}") find_package(SomeLib REQUIRED)
第一个命令定义了 CMake 在之后搜索的位置Find*.cmake,我添加了可以找到的目录SomeLib,FindSomeLib.cmake因此find_package()可以按预期工作。
SomeLib
FindSomeLib.cmake
但这有点奇怪,因为find_package()存在的原因之一是远离非跨平台硬编码路径。
这通常是怎么做的?cmake/我应该将目录复制SomeLib到我的项目中并设置CMAKE_MODULE_PATH相对吗?
cmake/
CMAKE_MODULE_PATH
命令find_package有两种模式:Module模式和Config模式。Module当您真正需要模式时,您正在尝试使用Config模式。
find_package
Module
Config
Find<package>.cmake位于您的项目中的 文件。 像这样的东西:
Find<package>.cmake
CMakeLists.txt cmake/FindFoo.cmake cmake/FindBoo.cmake
CMakeLists.txt内容:
CMakeLists.txt
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") find_package(Foo REQUIRED) # FOO_INCLUDE_DIR, FOO_LIBRARIES find_package(Boo REQUIRED) # BOO_INCLUDE_DIR, BOO_LIBRARIES include_directories("${FOO_INCLUDE_DIR}") include_directories("${BOO_INCLUDE_DIR}") add_executable(Bar Bar.hpp Bar.cpp) target_link_libraries(Bar ${FOO_LIBRARIES} ${BOO_LIBRARIES})
请注意,它CMAKE_MODULE_PATH具有高优先级,当您需要重写标准Find<package>.cmake文件时可能很有用。
<package>Config.cmake位于 外部 并由install 其他项目的命令生成的文件(Foo例如)。
<package>Config.cmake
install
Foo
foo图书馆:
foo
> cat CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(Foo) add_library(foo Foo.hpp Foo.cpp) install(FILES Foo.hpp DESTINATION include) install(TARGETS foo DESTINATION lib) install(FILES FooConfig.cmake DESTINATION lib/cmake/Foo)
配置文件的简化版本:
> cat FooConfig.cmake add_library(foo STATIC IMPORTED) find_library(FOO_LIBRARY_PATH foo HINTS "${CMAKE_CURRENT_LIST_DIR}/../../") set_target_properties(foo PROPERTIES IMPORTED_LOCATION "${FOO_LIBRARY_PATH}")
默认项目安装在CMAKE_INSTALL_PREFIX目录中:
CMAKE_INSTALL_PREFIX
> cmake -H. -B_builds > cmake --build _builds --target install -- Install configuration: "" -- Installing: /usr/local/include/Foo.hpp -- Installing: /usr/local/lib/libfoo.a -- Installing: /usr/local/lib/cmake/Foo/FooConfig.cmake
用于find_package(... CONFIG)包含FooConfig.cmake导入的目标foo:
find_package(... CONFIG)
FooConfig.cmake
> cat CMakeLists.txt cmake_minimum_required(VERSION 2.8) project(Boo) # import library target `foo` find_package(Foo CONFIG REQUIRED) add_executable(boo Boo.cpp Boo.hpp) target_link_libraries(boo foo) > cmake -H. -B_builds -DCMAKE_VERBOSE_MAKEFILE=ON > cmake --build _builds Linking CXX executable Boo /usr/bin/c++ ... -o Boo /usr/local/lib/libfoo.a
请注意,导入的目标是 高度 可配置的。看我的回答。
更新