簡體   English   中英

CMake - 在頂級CMakeLists.txt中定義包含路徑和庫

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

我的源代碼樹看起來像這樣:

--- src/CMakeLists.txt
--- src/MoonLanding/
----- CMakeLists.txt
----- main.cpp

要在src/Moonlanding/構建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編譯。

但是,我想調用cmake . src/ 為此,我將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/Moonlandingsrc/編譯三次。 為什么會這樣,是否有更清潔的方式來實現這個項目的建設?

(我想分離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源中每次與緩存相關的更改后,不要忘記進行干凈的構建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM