cmake 基本命令


1 # CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

2 項目信息
project (Demo2)

3 aux_source_directory 查找當前目錄下的所有源文件並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)

4 add_executable 工程生成目標文件
add_executable(Demo ${DIR_SRCS})

5 target_link_libraries 將若干庫鏈接到目標庫文件
target_link_libraries(myProject comm) # 連接libhello.so庫,默認優先鏈接動態庫
target_link_libraries(myProject libcomm.a) # 顯示指定鏈接靜態庫
target_link_libraries(myProject libcomm.so) # 顯示指定鏈接動態庫
target_link_libraries(<name> lib1 lib2 lib3)
鏈接的順序應當符合gcc鏈接順序規則,被鏈接的庫放在依賴它的庫的后面,即如果上面的命令中,lib1依賴於lib2, lib2又依賴於lib3,則在上面命令中必須嚴格按照lib1 lib2 lib3的順序排列,否則會報錯
也可以自定義鏈接選項, 比如針對lib1使用-WL選項,target_link_libraries(<name> lib1 -WL, lib2 lib3)

6 add_library 生成靜態鏈接庫和動態庫
add_library(libname [SHARED|STATIC] source1 source2 ... sourceN)
add_library (hello STATIC ${LIBHELLO_SRC}) #生成靜態鏈接庫
add_library (hello SHARED ${LIBHELLO_SRC}) #生成動態鏈接庫

7 SET_TARGET_PROPERTIES 設置輸出別名,所以,希望 "hello_static" 在輸出時,不是"hello_static",而是以"hello"的名字顯示,故設置如下
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME) #獲取值

8 include_directories 設置頭文件位置,相當於g++ -I,可以用相對貨絕對路徑,也可以用自定義的變量值
include_directories(../../../thirdparty/comm/include)

9 link_directories 添加需要鏈接的庫文件目錄,它相當於g++命令的-L選項的作用
link_directories(directory1 directory2 ...)
例:link_directories("/home/server/third/lib")

10 link_libraries 添加需要鏈接的庫文件路徑
語法:
link_libraries(library1 <debug | optimized> library2 ...)
# 直接是全路徑
link_libraries(“/home/server/third/lib/libcommon.a”)
# 下面的例子,只有庫名,cmake會自動去所包含的目錄搜索
link_libraries(iconv)
# 傳入變量
link_libraries(${RUNTIME_LIB})
# 也可以鏈接多個
link_libraries("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so" "/opt/MATLAB/R2012a/bin/glnxa64/libmx.so")

11 SET_TARGET_PROPERTIES 用來設置輸出的名稱
SET_TARGET_PROPERTIES (target1 target2 ...PROPERTIES prop1 value1 prop2 value2 ...)
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1) 實現動態庫版本號 VERSION指代動態庫版本,SOVERSION指代API版本。
SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") 將libhello_static.a庫名稱輸出為libhello.a

12 GET_TARGET_PROPERTY 獲取屬性值
GET_TARGET_PROPERTY (VAR target property) VAR:變量 target:目標 property:屬性
GET_TARGET_PROPERTY (OUTPUT_VALUE hello_static OUTPUT_NAME)

13 MESSAGE 打印cmake時信息
MESSAGE (STATUS "This is the hello_static OUTPUT_NAME: " ${OUTPUT_VALUE})

14 add_library 導入已有的庫
add_library(<name> [STATIC | SHARED | MODULE | UNKNOWN] IMPORTED)
導入了一個已存在的<name>庫文件,導入庫一般配合set_target_properties使用,這個命令用來指定導入庫的路徑,比如:
add_library(test SHARED IMPORTED)
set_target_properties( test #指定目標庫名稱
PROPERTIES IMPORTED_LOCATION #指明要設置的參數
libs/src/${ANDROID_ABI}/libtest.so #設定導入庫的路徑)

15 set
# 設置可執行文件的輸出路徑(EXCUTABLE_OUTPUT_PATH是全局變量)
set(EXECUTABLE_OUTPUT_PATH [output_path])
# 設置庫文件的輸出路徑(LIBRARY_OUTPUT_PATH是全局變量)
set(LIBRARY_OUTPUT_PATH [output_path])
# 設置C++編譯參數(CMAKE_CXX_FLAGS是全局變量)
set(CMAKE_CXX_FLAGS "-Wall std=c++11")
# 設置源文件集合(SOURCE_FILES是本地變量即自定義變量)
set(SOURCE_FILES main.cpp test.cpp ...)
# 設置編譯類型debug 或者release。 debug 版會生成相關調試信息,可以使用GDB 進行調試;release不會生成調試信息
set(CMAKE_BUILE_TYPE DEBUG)
# 設置編譯器的類型
SET(CMAKE_C_FLAGS_DEBUG “-g -Wall”)
# 設置低版本g++編譯器支持c++11,高版本自動識別
set(CMAKE_CXX_STANDARD 11)

需要注意的是,在哪里 ADD_EXECUTABLE 或 ADD_LIBRARY,如果需要改變目標存放路徑,就在哪里的上面加入上述的定義

16 add_subdirectory
如果當前目錄下還有子目錄時可以使用add_subdirectory,子目錄中也需要包含有CMakeLists.txt
# sub_dir指定包含CMakeLists.txt和源碼文件的子目錄位置
# binary_dir是輸出路徑, 一般可以不指定
add_subdirecroty(sub_dir [binary_dir])

17 文件操作命令file
# 將message寫入filename文件中,會覆蓋文件原有內容
file(WRITE filename "message")
# 將message寫入filename文件中,會追加在文件末尾
file(APPEND filename "message")
# 重命名文件
file(RENAME <oldname> <newname>)
# 刪除文件, 等於rm命令
file(REMOVE [file1 ...])
# 創建目錄
file(MAKE_DIRECTORY [dir1 dir2 ...])
#這個命令將把該目錄下及所有子文件夾內的所有后綴為.cpp的文件的路徑,全部放入SRC_LIST這個變量中

file(GLOB_RECURSE SRC_LIST "*.cpp")
file(GLOB_RECURSE HEADERS "*.h")
file(GLOB_RECURSE FORMS "*.ui")
file(GLOB_RECURSE RESOURCES "*.qrc")

18 set_directory_properties 設置某個路徑的一種屬性
set_directory_properties(PROPERTIES prop1 value1 prop2 value2)
prop1 prop代表屬性,取值為:
INCLUDE_DIRECTORIES
LINK_DIRECTORIES
INCLUDE_REGULAR_EXPRESSION
ADDITIONAL_MAKE_CLEAN_FILES

19 find_library 查找庫所在目錄,並將查找到路徑放入到變量中
find_library(RUNTIME_LIB_VAR rt /usr/lib /usr/local/lib NO_DEFAULT_PATH)
cmake會在目錄中查找,如果所有目錄中都沒有,值RUNTIME_LIB_VAR就會被賦為NO_DEFAULT_PATH

20 add_definitions
向 C/C++編譯器添加-D 定義,比如:
add_definitions(-DENABLE_DEBUG -DABC),參數之間用空格分割。
如果你的代碼中定義了#ifdef ENABLE_DEBUG #endif,這個代碼塊就會生效

21 add_dependencies
定義 target 依賴的其他 target,確保在編譯本 target 之前,其他的 target 已經被構建。
add_dependencies(target-name depend-target1
depend-target2 ...)


語法說明:
CMakelist中,命令名字是不區分大小寫的,而參數和變量是大小寫相關的。
CMake中使用"#"表示注釋該行代碼。
使用${}進行變量的引用
SET(變量 值) 自定義變量

變量說明:
PROJECT_NAME 返回通過 PROJECT 指令定義的項目名稱。
PROJECT_SOURCE_DIR==<projectname>_SOURCE_DIR 指向的是<項目目錄>
PROJECT_BINARY_DIR==<projectname>_BINARY_DIR 指向的是<項目目錄>/build目錄
CMAKE_CURRENT_SOURCE_DIR 指的是當前處理的 CMakeLists.txt 所在的路徑,比如上面我們提到的 src 子目錄
CMAKE_MODULE_PATH 這個變量用來定義自己的 cmake 模塊所在的路徑。如果你的工程比較復雜,有可能會自己編寫一些 cmake 模塊,這些 cmake 模塊是隨你的工程發布的,為了讓 cmake 在處理CMakeLists.txt 時找到這些模塊,你需要通過 SET 指令,將自己的 cmake 模塊路徑設置一下。
比如:
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
這時候你就可以通過 INCLUDE 指令來調用自己的模塊了

 

    
# CMake 最低版本號要求
cmake_minimum_required (VERSION 2.8)

# 項目信息
project (DEMO)
# 查找目錄下的所有源文件
# 並將名稱保存到 DIR_SRCS 變量
aux_source_directory(. DIR_SRCS)
#aux_source_directory(./src DIR_SRCS)
include_directories(./include)
# 添加 math 子目錄
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
add_subdirectory(src)
link_libraries(MathFunctions)
link_directories(/home/qilin64/Documents/work/demo/libs)
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)


# 指定生成目標
add_executable(Demo ${DIR_SRCS})

# 添加鏈接庫
#target_link_libraries(Demo MathFunctions)

  

file操作:
message(STATUS "current dir: ${CMAKE_CURRENT_SOURCE_DIR}")  
file(WRITE test1.txt "Some messages to Write\n" )  
file(APPEND test1.txt "Another message to write\n")  
file(READ test1.txt CONTENTS LIMIT 4 OFFSET 12)  
message(STATUS "contents of test1.txt is: \n ${CONTENTS}")  
file(MD5 ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt HASH_CONTENTS)  
message(STATUS "hash contents of test1.txt is: \n ${HASH_CONTENTS}")  
file(STRINGS test1.txt PARSED_STRINGS)  
message(STATUS "\n strings of test1.txt is: \n ${PARSED_STRINGS}")  
file(GLOB files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "*.*")  
message(STATUS  "files: ${files}")  
file(MAKE_DIRECTORY dir1 dir2)  
file(RENAME dir2 dir3)  
file(REMOVE dir3)  
file(REMOVE_RECURSE dir3)  
file(RELATIVE_PATH relative_path ${PROJECT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/test1.txt)  
message(STATUS "relative path : ${relative_path}")  
file(TO_CMAKE_PATH "$ENV{PATH}" cmake_path)  
message(STATUS "cmake path: ${cmake_path}")  
file(TO_NATIVE_PATH "/usr/local/sbin;/usr/local/bin" native_path)  
message(STATUS "native path: ${native_path}")  
file(DOWNLOAD "http://www.baidu.com" ${CMAKE_CURRENT_SOURCE_DIR}/index.html SHOW_PROGRESS)  
file(COPY test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1)  
file(INSTALL test1.txt DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/dir1) 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM