CMake-在顶级CMakeLists.txt中定义包含路径和库

CMake - Defining Include Paths and Library in Top-Level CMakeLists.txt

本文关键字:包含 定义 路径 txt CMakeLists CMake-      更新时间:2023-10-16

我的源树如下所示:

--- 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源中每次与缓存相关的更改后进行干净的构建