如何仅在构建阶段执行 cmake::find_package
how to perform cmake::find_package at build stage only
我正在尝试将基于 cmake 的项目作为 github 存储库中的外部项目包含在
库中。该项目使用推荐的方式:
FIND_PACKAGE(VLCQt REQUIRED COMPONENTS Widgets)
cmake 在配置阶段执行此命令,因此您会看到库不是在那一刻构建的。
避免这种情况的正确方法是什么?
将自己的项目和VLCQt
项目放入具有ExternalProject_Add
的外部项目中,并创建一个顶级CMakeLists.txt
文件来逐个构建它们。
您的目录结构将如下所示:
ProjectRoot/
|-- CMakeLists.txt
|-- MyProject/
| |-- sources/
| `-- CMakeLists.txt
`-- modules/
|-- MyProject.cmake
`-- ExternalVLCQt.cmake
ProjectRoot/modules/ExternalVLCQt.cmake
可能如下所示:
set(VLCQT_ROOT ${EXT_INSTALL_PATH}/vlcqt CACHE INTERNAL "")
ExternalProject_Add(vlcqt
URL "http://url.of.source/release.0.1.tar.gz"
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${VLCQT_ROOT}
INSTALL_COMMAND make install
)
list(APPEND GLOBAL_THIRDPARTY_LIB_ARGS "-DVLCQT_ROOT:PATH=${VLCQT_ROOT}")
ProjectRoot/modules/MyProject.cmake
可能如下所示:
ExternalProject_Add(my_project
DEPENDS vlcqt
SOURCE_DIR ${CMAKE_SOURCE_DIR}/MyProject
CMAKE_ARGS
${GLOBAL_THIRDPARTY_LIB_ARGS}
-DCMAKE_INSTALL_PREFIX=${EXT_INSTALL_PATH}/my_project
BUILD_COMMAND make
)
最后,ProjectRoot/CMakeLists.txt
应包含以下内容:
cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(MyProject VERSION 0.1)
set(CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/modules"
${CMAKE_MODULE_PATH}
)
include(ExternalProject)
set_directory_properties(PROPERTIES EP_BASE ${CMAKE_BINARY_DIR}/ExtProjects)
get_directory_property(EXT_BASE_PATH EP_BASE)
set(EXT_INSTALL_PATH ${EXT_BASE_PATH}/Install)
include(ExternalVLCQt)
include(MyProject)
install(DIRECTORY ${EXT_INSTALL_PATH}/my_project DESTINATION .)
您可以在此处阅读有关此模式的更多信息。通过此模式,ProjectRoot/MyProject/CMakeLists.txt
将在构建vlcqt
后的顶级CMakeLists.txt
的生成时进行配置。因此,find_package
将找到VLCQt
包。
注意:在我的示例中,VLCQT_ROOT
将由使用find_package
命令的MyProject
CMakeLists.txt
接收。此变量是find_package
命令的提示,对于不同的包,这可能会有所不同。find_package
使用的每个 CMake 模块都有自己的可变要求。
相关文章:
- "Cannot find -l<directory>"错误 - CMake
- cannot find boost_process cmake find_package
- CMake, Exe cant find DLL
- 如何处理"Cmake Error: Unable to find the requested Boost libraries"?
- CMake/Make cannot find libusb
- 如何修复窗户上的 cmake find_package "Could NOT find SDL2"?
- CMake - OpenCV - cannot find -lDisplayImage
- CMake shell find
- cmake cannot find LibXml2
- CMAKE 3.9.3 Cannot Find Boost1.65.1 Boost_Python
- CMake linking Boost: cannot find -lboost_program_options
- Android CMake: Could NOT find OpenSSL
- Cmake cannot find QGLWidget
- CMake + freeglut3: cannot find usbhid.h
- 使用 CMake 时出现"Could not find boost libraries"错误
- QiBuild/CMake cannot not find BOOST_FILESYSTEM
- CMake is unable to find boost_asio
- cmake does not find qt 5.1.1
- cmake 错误' Could NOT find CXX11 ' VS 2010?
- 关于空cmake FIND宏的问题