CMakeLists.txt學習記錄及學習資料

PROJECT (項目名稱) //必寫,生成項目名

SET (SRC_LIST 1.c 2.c 3.c) //視情況而定,當一個項目有不止一個.C/.CPP文件時,可以將它們整體命名爲SRC_LIST變量
//注意,當某個C/CPP文件的文件名有空格,比如fu nc.c此時必須使用雙引號,即寫爲SET(SRC_LIST“fu nc.c")
//.C/.CPP文件之間可以用空格隔開,也可以用分號隔開

ADD_EXECUTABLE (隨意命名 .c/.cpp文件名稱)//必寫 ,給該C/CPP文件生成一個可執行文件,這個可執行文件的名字就是自己隨意命名的

ADD_EXECUTABLE (隨意命名 ${SRC_LIST}) //必寫,但是視情況而定選擇上面一種寫法或者這種寫法,如果需要SET語句,最好使用這種寫法,含義與上面那種寫法一樣

ADD_SUBDIRECTORY (在當前工程存放源文件的子目錄的名稱 指定的在build文件下的子目錄名稱)
//在當前工程存放源文件的子目錄的名稱,這裏的源文件就是指C/CPP文件
//指定的在build文件下的子目錄名稱是用於存放構建可執行文件時生成的中間二進制和目標二進制的
//比如:
../t1是整個t1項目的路徑
../t1/src 路徑下存放main.c
運行ADD_SUBDIRECTORY (src bin)語句
構建之後就可以發現main.c生成的可執行二進制文件以及中間二進制文件就生成在../t1/build/bin路徑

SUBDIRS (在當前工程存放源文件的子目錄的名稱)
//功能與上面的那個語句基本相同
//比如:
../t1是整個t1項目的路徑
../t1/src 路徑下存放main.c
運行SUBDIRS (src)語句
構建之後就可以發現main.c生成的可執行二進制文件以及中間二進制文件就生成在../t1/build/src路徑

INSTALL (FILES 要安裝的普通文件的文件名 DESTINATION 想要安裝的路徑
INSTALL (PROGRAMS 要安裝的非目標文件的可執行程序比如腳本一類的東西的名稱 DESTINATION 想要安裝的路徑
INSTALL (DIRECTORY 要安裝的目錄名稱 DESTINATION 想要安裝的路徑
//比如:
要求:將runhello.sh與hello二進制安裝到/<prefix>/bin
將doc目錄裏的hello.txt及COPYRIGHT,README安裝到/<prefix>/share/doc/cmake/t2
所以:
安裝COPYRIGHT和README
INSTALL (FILES COPYRIGHT README DESTINATION share/doc/cmake/t2)
安裝runhello.sh腳本
INSTALL (PROGRAMS runhello.sh DESTINATION bin)
安裝hello.txt-------由於hello.txt在doc目錄下,所以不能直接安裝真個目錄doc,要想只安裝doc裏的內容,使用 doc/
INSTALL (DIRECTORY doc/ DESTINATION share/doc/cmake/t2)

INSTALL (TARGETS 需要安裝的東西們的名字 ARCHIVE|LIBRARY|RUNTIME DESTINATION 想要安裝的路徑
//功能:安裝的是可執行二進制,靜態庫,動態庫,一般是ADD_EXECUTABLE或者ADD_LIBRARY定義的目標文件
//當需要安裝的東西不止一樣時,相互之間用空格隔開
//ARCHIVE 靜態庫關鍵字
LIBRARY 動態庫
RUNTIME 可執行二進制
//比如:
要求:將hello的共享庫安裝到<prefix>/lib目錄,庫包括動態庫libhello.so.XX和靜態庫libhello.a以及libhello_static.a,將hello.h安裝到<prefix>/include/lib目錄
步驟:
INSTALL (TARGETS hello hello_static
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib)
INSTALL (FILES hello.h DESTINATION include/hello)

ADD_LIBRARY (庫的名稱 SHARED|STATIC|MODULE C/CPP源文件名字或者是在SET裏設置的變量的名字)
//SHARED 動態庫        STATIC 靜態庫    MODULE使用dyld時有效,否則被視爲動態庫
//比如:
SET (LIBHELLO_SRC hello.c)
ADD_LIBRARY (hello SHARED ${LIBHELLO_SRC})
即可生成libhello.so
//庫的名稱不用寫全爲libhello.so,只需填寫hello,cmake系統會自動生成全名

SET_TARGET_PROPERTIES (庫的名字 PROPERTIES OUTPUT_NAME "庫的新名字")
//功能:由於庫的名字相同時會造成其中一個無法正常構建,若想同時構建兩個名字相同的靜態庫和動態庫,需要使用該語句
//比如:
要求:同時構造名字爲libhello.XX的靜態庫和動態庫
所以:
SET (LIBHELLO_SRC hello.c)
ADD_LIBRARY (hello SHARED ${LIBHELLO_SRC})
ADD_LIBRARY (hello_static STATIC ${LIBHELLO_SRC})
SET_TARGET_PROPERTIES (hello_static PROPERTIES OUTPUT_NAME "hello")
即可同時獲得libhello.so和libhello.a兩個庫

SET_TARGET_PROPERTIES (動態庫名字 PROPERTIES VERSION 數字SOVETSION 數字
//語句裏的兩個數字不需要相同,可以帶小數點
//功能:實現動態庫版本號
VETSION 指代動態庫版本
SOVERSION 指代API版本
//比如:
要求:生成一個庫版本號爲1.2,API版本號爲1的動態庫且庫的名字叫hello(也不需要寫全名)
SET_TARGET_PROPERTIES (hello PROPERTIES VERSION 1.2 SOVERSION 1)

INCLUDE_DIRECTORIES (頭文件路徑)
//功能:添加頭文件路徑
//比如:
頭文件在/usr/incude/hello裏,添加路徑
INCLUDE_DIRECTORIES (/usr/include/hello)

LINK_DIRECTORIES (非標準的共享庫搜索路徑)
//非標準的共享庫指的是自定義的庫,由於路徑不是默認的所以要用到該語句

TARGET_LINK_LIBRARIES (可執行文件的名字 所要鏈接的共享庫的名字)
//功能:將可執行文件鏈接到所需要的庫
//比如:
要求:有一個可執行文件名字爲main 且它所需要鏈接的庫是在默認路徑的名字爲hello
TARGET_LINK_LIBRARIES (main hello)



//所有cmake命令

//cmake官網

http://download.csdn.net/detail/u014228701/9703324
//cmake學習資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章