CMakeLists.txt里添加宏開關(guān)
比如添加打印log的宏LOG,代碼如下
option(DEFINE__LOG__ "print log" ON)
if(DEFINE__LOG__)
add_definitions(-D__LOG__)
endif(DEFINE__LOG__)
但在源碼里面不能有
#define __LOG__
這樣就可以在cmake的時候開關(guān)這個宏了
cmake -D__LOG__=ON ..
CMakeLists.txt 添加依賴項
- 如果添加的依賴項只有頭文件,那么就比較簡單黍衙,設(shè)定頭文件路徑匹层,添加即可呵晨。設(shè)定頭文件路徑有兩種方式吐限,如果可以通過find_package添加最好忽刽,如果不行天揖,就用set設(shè)定目錄,如下:
find_package(Eigen3 REQUIRED)
include_directories(${EIGEN3_INCLUDE_DIR})
或者
set(EIGEN3_INCLUDE_DIR ${FaceRecon_3RDPARTY_DIR}/eigen)
include_directories(${EIGEN3_INCLUDE_DIR})
- 如果添加的依賴項有對應(yīng)的鏈接庫缔恳,那么除了添加頭文件宝剖,還需要將鏈接庫添加進(jìn)去
find_package(OpenCV 3.4.3 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
如果添加的依賴庫是自己生成的,直接添加名字就行歉甚,比如添加hello庫
target_link_libraries(${PROJECT_NAME} hello)
如果是自己生成的依賴庫有很多万细,可放在lib目錄下,通過如下命令添加纸泄,這里只針對windows
FILE(GLOB suitesparse_libs "${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/suitesparse/lib64/*.lib")
target_link_libraries(hello ${suitesparse_libs})
- 如果依賴項需要自己編譯對應(yīng)依賴庫赖钞,那么需要包含依賴項代碼,并為其編寫對應(yīng)CMakeLists.txt
例如聘裁,對應(yīng)項目目錄如下:
demo
CMakeLists.txt
-include
-src
-thirdparty
-hello
-include
-src
CMakeLists.txt
-eigen
CMakeLists.txt
我們有自己編譯hello依賴項雪营,其中在demo目錄下的CMakeLists.txt里添加子目錄
add_subdirectory(thirdparty)
在thirdparty目錄下的CMakeLists.txt里添加子目錄
add_subdirectory(hello)
其中hello里的CMakeLists.txt只需要將平時生成可執(zhí)行文件的語句
add_executable(${PROJECT_NAME} ${SOURCE_FILES} ${HEADER_FILES})
替換成
add_library(${PROJECT_NAME} STATIC ${SOURCE_FILES} ${HEADER_FILES})
這里 STATIC 表示是生成靜態(tài)庫
CMake aux_source_directory
讓CMake找到源文件
aux_source_directory(src SOURCE_FILES)
add_executable(demo ${SOURCE_FILES})
把當(dāng)前路徑下的src目錄下的所有源文件放到變量
SOURCE_FILES中
CMake FILE
FILE語句功能強大,可以讀衡便、寫献起、文件系統(tǒng)等洋访,具體可參考cmake官方網(wǎng)站
FILE(GLOB SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp ${CMAKE_CURRENT_SOURCE_DIR}/src/hello/*.cpp)
FILE(GLOB HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h* ${CMAKE_CURRENT_SOURCE_DIR}/include/hello/*.h*)
文件系統(tǒng)的作用
set_target_properties
該命令一般用在導(dǎo)入第三方動態(tài)庫的時候,比如:
set_target_properties(lib_opencv
PROPERTIES
IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libopencv_java3.so
)
該命令語法如下:
set_target_properties(target1 target2 ...
PROPERTIES prop1 value1
prop2 value2 ...)
設(shè)置target的PROPERTIES谴餐,上述例子中姻政,我們設(shè)置了opencv動態(tài)庫的路徑。
install
Specify rules to run at install time.
也就是在運行install的時候才會運行的語句
install(TARGETS targets... [EXPORT <export-name>]
[[ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|
PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE]
[DESTINATION <dir>]
[PERMISSIONS permissions...]
[CONFIGURATIONS [Debug|Release|...]]
[COMPONENT <component>]
[NAMELINK_COMPONENT <component>]
[OPTIONAL] [EXCLUDE_FROM_ALL]
[NAMELINK_ONLY|NAMELINK_SKIP]
] [...]
[INCLUDES DESTINATION [<dir> ...]]
)
可以將lib,framework,dll ,header等install到固定位置
debug , release
set(CMAKE_RELEASE_POSTFIX "")
set(CMAKE_DEBUG_POSTFIX "-debug")
可以通過debug還是release 生成對應(yīng)版本庫岂嗓,在鏈接該庫的時候:
target_link_libraries(LandmarkTracker PUBLIC debug ${ncnn_LIB_DEBUG} optimized ${ncnn_LIB_RELEASE})