- 1> 盡量使用外部build而不是內(nèi)部build.
所謂的內(nèi)外,指的是make目錄和CMakeLists.txt不在一個(gè)目錄下。
好處是,所有的臨時(shí)文件都會(huì)生成在當(dāng)前運(yùn)行cmake/make的目錄。
譬如在項(xiàng)目根目錄有一個(gè)CMakeLists.txt作為top-level file, 幾個(gè)代碼子目錄,一個(gè)build目錄,可以用:
cd build
cmake ..
make
此時(shí)中間文件不會(huì)污染項(xiàng)目的目錄結(jié)構(gòu)。
- 2> 可以用如下方式生成同名的靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù):
set(libname "mylib")

add_library(libname_static STATIC src1 src2)
set_target_properties(libname_static OUTPUT_NAME ${libname})
add_library(libname SHARED src1 src2)
- 3> 如何獲取當(dāng)前運(yùn)行目錄(working directory):可以在根目錄設(shè)置一個(gè)project_dir變量,設(shè)置為源代碼目錄,如下
set(project_top_dir ${CMAKE_CURRENT_SOURCE_DIR}/")
add_subdirectory(sub1)
add_subdirectory(sub2)
此時(shí),各個(gè)子目錄中可以應(yīng)用project_top_dir.
4> 處理跨平臺(tái)的第三方庫(kù):假設(shè)第三方庫(kù)不是由CMake編譯得來(lái),但要檢測(cè)依賴和變動(dòng),則可以用imported屬性:
add_library(ssllib SHARED IMPORTED)
add_library(cryptolib SHARED IMPORTED)
#May have different dependent libraries
set(libsuffix ${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR})
set_target_properties(ssllib PROPERTIES IMPORTED_LOCATION "${project_top_dir}contrib/openssl/lib/libssl-${libsuffix}.so")
set_target_properties(cryptolib PROPERTIES IMPORTED_LOCATION "${project_top_dir}contrib/openssl/lib/libcrypto-${libsuffix}.so")
........................
#other CMakeLists.txt
add_executable(myExe src1 src2)
target_link_libraries(myExe ssllib cryptolib)