CMake-在顶级CMakeLists.txt中定义包含路径和库
CMake - Defining Include Paths and Library in Top-Level CMakeLists.txt
我的源树如下所示:
--- src/CMakeLists.txt
--- src/MoonLanding/
----- CMakeLists.txt
----- main.cpp
为了构建MoonLanding
项目,在src/Moonlanding/
中,我执行以下
cmake . -DGFLAGS_INCLUDE_DIR=${CBVR_DEPENDENCIES}/gflags/build/include
-DGFLAGS_LIBRARY=${CBVR_DEPENDENCIES}/gflags/build/lib/libgflags.a
-DAtlas_CBLAS_INCLUDE_DIR=${CBVR_DEPENDENCIES}/ATLAS-install/include
-DAtlas_CBLAS_LIBRARY=${CBVR_DEPENDENCIES}/ATLAS-install/lib/libcblas.a
-DAtlas_CLAPACK_INCLUDE_DIR=${CBVR_DEPENDENCIES}/ATLAS-install/include
-DAtlas_LAPACK_LIBRARY=${CBVR_DEPENDENCIES}/ATLAS-install/lib/liblapack.a
-DAtlas_BLAS_LIBRARY=${CBVR_DEPENDENCIES}/ATLAS-install/lib/libatlas.a
-DLMDB_INCLUDE_DIR=${CBVR_DEPENDENCIES}/mdb/libraries/liblmdb
-DLMDB_LIBRARIES=${CBVR_DEPENDENCIES}/mdb/libraries/liblmdb/liblmdb.so
-DBOOST_ROOT=${CBVR_DEPENDENCIES}/boost_1_56_0/
上面对cmake的调用非常有效,并且MoonLanding
可以编译。
但是,我想在src/
下调用cmake .
。为此,我将src/CMakeLists.txt
定义为:
set(GFLAGS_INCLUDE_DIR $ENV{CBVR_DEPENDENCIES}/gflags/build/include)
set(GFLAGS_LIBRARY $ENV{CBVR_DEPENDENCIES}/gflags/build/lib/libgflags.a)
set(Atlas_CBLAS_INCLUDE_DIR $ENV{CBVR_DEPENDENCIES}/ATLAS-install/include)
set(Atlas_CBLAS_LIBRARY $ENV{CBVR_DEPENDENCIES}/ATLAS-install/lib/libcblas.a)
set(Atlas_CLAPACK_INCLUDE_DIR $ENV{CBVR_DEPENDENCIES}/ATLAS-install/include)
set(Atlas_LAPACK_LIBRARY $ENV{CBVR_DEPENDENCIES}/ATLAS-install/lib/liblapack.a)
set(Atlas_BLAS_LIBRARY $ENV{CBVR_DEPENDENCIES}/ATLAS-install/lib/libatlas.a)
set(LMDB_INCLUDE_DIR $ENV{CBVR_DEPENDENCIES}/mdb/libraries/liblmdb)
set(LMDB_LIBRARIES $ENV{CBVR_DEPENDENCIES}/mdb/libraries/liblmdb/liblmdb.so)
set(BOOST_ROOT $ENV{CBVR_DEPENDENCIES}/boost_1_56_0/)
add_subdirectory(Moonlanding)
CMake然后给我错误:
CMake Error at /usr/local/share/cmake-3.0/Modules/FindPackageHandleStandardArgs.cmake:136 (message):
Could NOT find LMDB (missing: LMDB_INCLUDE_DIR LMDB_LIBRARIES)
如果我再次调用cmake
,错误就会消失。总的来说,我需要调用cmake .
三次src/Moonlanding
才能从src/
编译。为什么会这样?有没有一种更清洁的方式来建设这个项目?
(我之所以要将GFLAGS_INCLUDE_DIR和其他指令分开,是为了帮助用户自动化构建过程。)
从命令行设置变量和cmake set()
命令之间的唯一区别(适用于您的情况)是默认缓存策略。
最有可能的是,您可以通过缓存值来解决问题:
set(GFLAGS_INCLUDE_DIR $ENV{CBVR_DEPENDENCIES}/gflags/build/include CACHE PATH "Some comment here")
# other sets with "CACHE" addition
PS。不要忘记在cmake源中每次与缓存相关的更改后进行干净的构建
相关文章:
- MAKE:找不到包含的用户定义的头文件?
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 即使我没有包含多个文件,C++中的多个定义错误
- C2011: 'Card':"类"类型重新定义(尽管使用了包含保护并且没有在文件中重新定义.cpp类)
- 为什么更改包含 psapi.h 的顺序会产生编译错误?(标识符 BOOL 未定义)
- 生成文件缺少包含路径 尽管路径存在并已定义
- (Wix 安装程序)如何包含自定义操作依赖项
- 'dlopen''ing 包含符号的 .so 会导致未定义的符号
- 在Visual Studio代码中包含自定义c++库的问题
- 只要我不包含一个标题,重新定义C++关键字合法吗
- 在Qt应用程序中包含Python.h会导致对Qt函数的未定义引用
- 如何配置 Doxygen 以在"Class Index"中包含类的类型定义?
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- 链接器错误:在包含 .so lib 后未定义对 xxx 的引用
- 包含问题:"多重定义"、"此处首次定义"
- 未定义的引用,即使库正在链接并且它包含正确的符号
- 包含适当的标头时,实现文件中的多个定义出错
- C++ 在虚幻引擎中包含库后重新定义类型
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 从包含定义,打断以前的其他包含