在CMake中隔离gitsubmodule项目 我试图使用CMASE和GITSUB模块管理我的C++项目依赖关系。我遵循这里描述的布局:它在较小的项目中非常适合我。但我已经开始在更大的项目上使用它,我遇到了一些关于CMake的问题 我当前的设置
我的所有外部生成依赖项都位于主项目中的在CMake中隔离gitsubmodule项目 我试图使用CMASE和GITSUB模块管理我的C++项目依赖关系。我遵循这里描述的布局:它在较小的项目中非常适合我。但我已经开始在更大的项目上使用它,我遇到了一些关于CMake的问题 我当前的设置,c++,cmake,git-submodules,C++,Cmake,Git Submodules,我的所有外部生成依赖项都位于主项目中的contrib/子文件夹中。每个模块都是一个子模块,并有自己的单独目录。 /contrib -/本征 -/卷曲 -/leapserial -/zlib -/opencv 等 contrib/CMakeListst.txt只需初始化子模块,并为每个外部依赖项添加子目录 # EIGEN execute_process(COMMAND git submodule update --recursive --init -- eigen WORKING_DIREC
contrib/
子文件夹中。每个模块都是一个子模块,并有自己的单独目录。
/contrib
-/本征
-/卷曲
-/leapserial
-/zlib
-/opencv
等
contrib/CMakeListst.txt只需初始化子模块,并为每个外部依赖项添加子目录
# EIGEN
execute_process(COMMAND git submodule update --recursive --init -- eigen
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# options..
add_subdirectory(eigen EXCLUDE_FROM_ALL)
# CURL
execute_process(COMMAND git submodule update --recursive --init -- curl
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(curl EXCLUDE_FROM_ALL)
# LEAP SERIAL
execute_process(COMMAND git submodule update --recursive --init -- leapserial
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(leapserial EXCLUDE_FROM_ALL)
# ZLIB
execute_process(COMMAND git submodule update --recursive --init -- zlib
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(zlib EXCLUDE_FROM_ALL)
# OPENCV
execute_process(COMMAND git submodule update --recursive --init -- opencv
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
# Initialize cache with CMake build options..
add_subdirectory(opencv EXCLUDE_FROM_ALL)
这个设置对我来说非常有效:
CMakeListst.txt
中将库添加到我的构建中非常简单。既然我有目标,我就有
添加可执行文件(SomeProjectmWorkingon)
${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp)
目标链接库(一些项目工作)
opencv_世界
本征
兹利布
)
add_subdirectory(blah)
到
但出于某种原因,这并不能解决问题
启用变量ALLOW\u DUPLICATE\u CUSTOM\u TARGETS
kind。。但这是一种黑客行为,只处理Make文件,而且这些库基本上仍然是“混合”的,所以这仍然是一个问题
2.
第二个问题在LeapSerial中提出,但说明了一个更大的问题。项目不再知道自己的名字。LeapSerial试图确定LeapSerial的版本,但当它要求项目版本时,它得到的是根项目版本。当子项目中的cmake代码要求“我在哪个项目中”时,它得到的是根项目,而不是它所在的直接项目
同样,父“名称空间”到处都在泄漏。这必然会造成越来越多的问题。我需要将子模块设置为自包含的
有更清洁的解决方案吗
ExternalProjectAdd可能会解决其中一些问题,但它自己也有很多问题。这是一个真正的非初学者b/c,它不做我列出的大部分工作。核心问题是,它不会暴露子项目的目标,只会吐回变量,然后你必须处理这些变量编写该教程的人肯定需要阅读。
ExternalProject\u Add
比你想象的更方便。例如,git
和修订版已经纳入其中。至于“它不公开子项目的目标”,与execute\u process
(也就是说,3d party Library构建在配置步骤上)相结合,它允许使用find\u package
作为外部库。对于add_subdirectory()
方法,目标和变量冲突是不可避免的。CMake既不提供变量也不提供目标名称空间。对,但是find_package
只是返回一些您必须管理的变量。它不会像使用target\u link\u库时那样自动处理所有内容。它也不会干净地管理工具链并与IDE绑定我猜如果没有名称空间,那么我猜我就完蛋了:(CMake不是一个足够成熟的工具,不适合轻松开发yetI最终通过使用Hunter软件包管理器解决了这个问题。它100%基于CMake,非常适合我的需要
add_subdirectory(blah EXCLUDE_FROM_ALL)