我正在尝试将基于 cmake 的项目包含在库 vlc-qt 中,作为来自 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
在顶层的构建时进行配置。因此,将找到包。CMakeLists.txt
vlcqt
find_package
VLCQt
注意:在我的示例中,VLCQT_ROOT
将由使用命令CMakeLists.txt
的MyProject
地方接收。find_package
此变量是find_package
命令的提示,对于不同的包,这可能会有所不同。使用的每个 CMake 模块find_package
都有自己的可变要求。