gpt4 book ai didi

cmake - 当您需要指定 CMAKE_MODULE_PATH 时,find_package() 有什么用?

转载 作者:行者123 更新时间:2023-12-03 04:24:02 25 4
gpt4 key购买 nike

我正在尝试使用 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 等等

我的 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() 有效正如预期的那样。

但这有点奇怪,因为 find_package() 存在的原因之一是摆脱非跨平台硬编码路径。

这通常是如何完成的?我应该将 SomeLibcmake/ 目录复制到我的项目中并相对设置 CMAKE_MODULE_PATH 吗?

最佳答案

命令find_package有两种模式:Module模式和 Config模式。你正在尝试使用Module当您真正需要时 Config 模式模式。

模块模式

Find<package>.cmake文件位于您的项目。像这样的事情:

CMakeLists.txt
cmake/FindFoo.cmake
cmake/FindBoo.cmake

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)。

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 -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 :

> 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

请注意,导入的目标是高度可配置的。看我的answer .

更新

关于cmake - 当您需要指定 CMAKE_MODULE_PATH 时,find_package() 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746936/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com