1. 程式人生 > >CMake之CMakeLists.txt編寫入門

CMake之CMakeLists.txt編寫入門

自定義變數

主要有隱式定義和顯式定義兩種。 
隱式定義的一個例子是PROJECT指令,它會隱式的定義< projectname >_BINARY_DIR< projectname >_SOURCE_DIR兩個變數;顯式定義使用SET指令構建自定義變數,比如:SET(HELLO_SRCmain.c)就可以通過${HELLO_SRC}來引用這個自定義變量了。

變數引用方式

使用${}進行變數的引用;在IF等語句中,是直接使用變數名而不通過${}取值。

常用變數

CMAKE_BINARY_DIR 
PROJECT_BINARY_DIR 
< projectname >_BINARY_DIR

 
這三個變數指代的內容是一致的,如果是in-source編譯,指得就是工程頂層目錄;如果是out-of-source編譯,指的是工程編譯發生的目錄。PROJECT_BINARY_DIR跟其它指令稍有區別,目前可以認為它們是一致的。

CMAKE_SOURCE_DIR 
PROJECT_SOURCE_DIR 
< projectname >_SOURCE_DIR 
這三個變數指代的內容是一致的,不論採用何種編譯方式,都是工程頂層目錄。也就是在in-source編譯時,他跟CMAKE_BINARY_DIR等變數一致。PROJECT_SOURCE_DIR跟其它指令稍有區別,目前可以認為它們是一致的。 
(out-of-source build與in-source build相對,指是否在CMakeLists.txt所在目錄進行編譯。)

CMAKE_CURRENT_SOURCE_DIR 
當前處理的CMakeLists.txt所在的路徑,比如上面我們提到的src子目錄。

CMAKE_CURRRENT_BINARY_DIR 
如果是in-source編譯,它跟CMAKE_CURRENT_SOURCE_DIR一致;如果是out-of-source編譯,指的是target編譯目錄。使用ADD_SUBDIRECTORY(src bin)可以更改這個變數的值。使用SET(EXECUTABLE_OUTPUT_PATH <新路徑>)並不會對這個變數造成影響,它僅僅修改了最終目標檔案存放的路徑。

CMAKE_CURRENT_LIST_FILE

 
輸出呼叫這個變數的CMakeLists.txt的完整路徑

CMAKE_CURRENT_LIST_LINE 
輸出這個變數所在的行

CMAKE_MODULE_PATH 
這個變數用來定義自己的cmake模組所在的路徑。如果工程比較複雜,有可能會自己編寫一些cmake模組,這些cmake模組是隨工程釋出的,為了讓cmake在處理CMakeLists.txt時找到這些模組,你需要通過SET指令將cmake模組路徑設定一下。比如SET(CMAKE_MODULE_PATH,${PROJECT_SOURCE_DIR}/cmake) 
這時候就可以通過INCLUDE指令來呼叫自己的模組了。

EXECUTABLE_OUTPUT_PATH 
新定義最終結果的存放目錄

LIBRARY_OUTPUT_PATH 
新定義最終結果的存放目錄

PROJECT_NAME 
返回通過PROJECT指令定義的專案名稱。

cmake呼叫環境變數的方式

使用$ENV{NAME}指令就可以呼叫系統的環境變量了。比如MESSAGE(STATUS "HOME dir: $ENV{HOME}")設定環境變數的方式是SET(ENV{變數名} 值)。

  1. CMAKE_INCLUDE_CURRENT_DIR 
    自動新增CMAKE_CURRENT_BINARY_DIR和CMAKE_CURRENT_SOURCE_DIR到當前處理的CMakeLists.txt,相當於在每個CMakeLists.txt加入:INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})

  2. CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE 
    將工程提供的標頭檔案目錄始終置於系統標頭檔案目錄的前面,當定義的標頭檔案確實跟系統發生衝突時可以提供一些幫助。

  3. CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH

系統資訊

  • CMAKE_MAJOR_VERSION,CMAKE主版本號,比如2.4.6中的2
  • CMAKE_MINOR_VERSION,CMAKE次版本號,比如2.4.6中的4
  • CMAKE_PATCH_VERSION,CMAKE補丁等級,比如2.4.6中的6
  • CMAKE_SYSTEM,系統名稱,比如Linux-2.6.22
  • CMAKE_SYSTEM_NAME,不包含版本的系統名,比如Linux
  • CMAKE_SYSTEM_VERSION,系統版本,比如2.6.22
  • CMAKE_SYSTEM_PROCESSOR,處理器名稱,比如i686
  • UNIX,在所有的類Unix平臺為TRUE,包括OSX和cygwin
  • WIN32,在所有的Win32平臺為TRUE,包括cygwin

主要的開關選項

  1. CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS 
    用來控制IF ELSE語句的書寫方式。

  2. BUILD_SHARED_LIBS 
    這個開關用來控制預設的庫編譯方式。如果不進行設定,使用ADD_LIBRARY並沒有指定庫型別的情況下,預設編譯生成的庫都是靜態庫;如果SET(BUILD_SHARED_LIBSON)後,預設生成的為動態庫。

  3. CMAKE_C_FLAGS 
    設定C編譯選項,也可以通過指令ADD_DEFINITIONS()新增。

  4. MAKE_CXX_FLAGS 
    設定C++編譯選項,也可以通過指令ADD_DEFINITIONS()新增。

cMake常用指令

這裡引入更多的cmake指令,為了編寫的方便,將按照cmakeman page 的順序介紹各種指令,不再推薦使用的指令將不再介紹。

基本指令

PROJECT(HELLO) 
指定專案名稱,生成的VC專案的名稱,使用${HELLO_SOURCE_DIR}表示專案根目錄。

INCLUDE_DIRECTORIES 
指定標頭檔案的搜尋路徑,相當於指定gcc的-I引數 
INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/Hello) #增加Hello為include目錄

TARGET_LINK_LIBRARIES 
新增連結庫,相同於指定-l引數 
TARGET_LINK_LIBRARIES(demoHello) #將可執行檔案與Hello連線成最終檔案demo

LINK_DIRECTORIES 
動態連結庫或靜態連結庫的搜尋路徑,相當於gcc的-L引數 
LINK_DIRECTORIES(${HELLO_BINARY_DIR}/Hello)#增加Hello為link目錄

ADD_DEFINITIONS 
向C/C++編譯器新增-D定義,比如: 
ADD_DEFINITIONS(-DENABLE_DEBUG-DABC) 
引數之間用空格分割。如果程式碼中定義了:

#ifdef ENABLE_DEBUG

#endif
  • 1
  • 2
  • 3

這個程式碼塊就會生效。如果要新增其他的編譯器開關,可以通過CMAKE_C_FLAGS變數和CMAKE_CXX_FLAGS變數設定。

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

ADD_EXECUTABLE 
ADD_EXECUTABLE(helloDemo demo.cxx demo_b.cxx) 
指定編譯,好像也可以新增.o檔案,將cxx編譯成可執行檔案

ADD_LIBRARY 
ADD_LIBRARY(Hellohello.cxx) #將hello.cxx編譯成靜態庫如libHello.a

ADD_SUBDIRECTORY 
ADD_SUBDIRECTORY(Hello) #包含子目錄

ADD_TEST 
ENABLE_TESTING 
ENABLE_TESTING指令用來控制Makefile是否構建test目標,涉及工程所有目錄。語法很簡單,沒有任何引數,ENABLE_TESTING()一般放在工程的主CMakeLists.txt中。 
ADD_TEST指令的語法是:ADD_TEST(testnameExename arg1 arg2 …) 
testname是自定義的test名稱,Exename可以是構建的目標檔案也可以是外部指令碼等等,後面連線傳遞給可執行檔案的引數。

如果沒有在同一個CMakeLists.txt中開啟ENABLE_TESTING()指令,任何ADD_TEST都是無效的。比如前面的Helloworld例子,可以在工程主CMakeLists.txt中新增

ADD_TEST(mytest ${PROJECT_BINARY_DIR}/bin/main)
ENABLE_TESTING
  • 1
  • 2

生成Makefile後,就可以執行make test來執行測試了。

AUX_SOURCE_DIRECTORY 
基本語法是:AUX_SOURCE_DIRECTORY(dir VARIABLE),作用是發現一個目錄下所有的原始碼檔案並將列表儲存在一個變數中,這個指令臨時被用來自動構建原始檔列表,因為目前cmake還不能自動發現新新增的原始檔。比如:

AUX_SOURCE_DIRECTORY(. SRC_LIST)
ADD_EXECUTABLE(main ${SRC_LIST})
  • 1
  • 2

可以通過後面提到的FOR EACH指令來處理這個LIST。

CMAKE_MINIMUM_REQUIRED 
語法為CMAKE_MINIMUM_REQUIRED(VERSION versionNumber [FATAL_ERROR]), 
比如:CMAKE_MINIMUM_REQUIRED(VERSION 2.5 FATAL_ERROR) 
如果cmake版本小與2.5,則出現嚴重錯誤,整個過程中止。

EXEC_PROGRAM 
在CMakeLists.txt處理過程中執行命令,並不會在生成的Makefile中執行。具體語法為:

EXEC_PROGRAM(Executable [directory in which to run][ARGS <arguments to executable>][OUTPUT_VARIABLE <var>][RETURN_VALUE <var>])
  • 1

用於在指定的目錄執行某個程式,通過ARGS新增引數,如果要獲取輸出和返回值,可通過OUTPUT_VARIABLERETURN_VALUE分別定義兩個變數。 
這個指令可以幫助在CMakeLists.txt處理過程中支援任何命令,比如根據系統情況去修改程式碼檔案等等。舉個簡單的例子,我們要在src目錄執行ls命令,並把結果和返回值存下來,可以直接在src/CMakeLists.txt中新增:

EXEC_PROGRAM(ls ARGS "*.c" OUTPUT_VARIABLE LS_OUTPUT RETURN_VALUE LS_RVALUE)
IF(not LS_RVALUE)
    MESSAGE(STATUS "ls result: " ${LS_OUTPUT})
ENDIF(not LS_RVALUE)
  • 1
  • 2
  • 3
  • 4

在cmake生成Makefile過程中,就會執行ls命令,如果返回0,則說明成功執行,那麼就輸出ls *.c的結果。關於IF語句,後面的控制指令會提到。

FILE指令 
檔案操作指令,基本語法為:

FILE(WRITEfilename "message to write"... )
FILE(APPENDfilename "message to write"... )
FILE(READfilename variable)
FILE(GLOBvariable [RELATIVE path] [globbing expression_r_rs]...)
FILE(GLOB_RECURSEvariable [RELATIVE path] [globbing expression_r_rs]...)
FILE(REMOVE[directory]...)
FILE(REMOVE_RECURSE[directory]...)
FILE(MAKE_DIRECTORY[directory]...)
FILE(RELATIVE_PATHvariable directory file)
FILE(TO_CMAKE_PATHpath result)
FILE(TO_NATIVE_PATHpath result)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

INCLUDE指令 
用來載入CMakeLists.txt檔案,也用於載入預定義的cmake模組。

INCLUDE(file1[OPTIONAL])
INCLUDE(module[OPTIONAL])
  • 1
  • 2

OPTIONAL引數的作用是檔案不存在也不會產生錯誤,可以指定載入一個檔案,如果定義的是一個模組,那麼將在CMAKE_MODULE_PATH中搜索這個模組並載入,載入的內容將在處理到INCLUDE語句是直接執行。

INSTALL指令

FIND_指令 
FIND_系列指令主要包含一下指令:

FIND_FILE(<VAR>name1 path1 path2 …)    VAR變數代表找到的檔案全路徑,包含檔名
FIND_LIBRARY(<VAR>name1 path1 path2 …)    VAR變量表示找到的庫全路徑,包含庫檔名
FIND_PATH(<VAR>name1 path1 path2 …)   VAR變數代表包含這個檔案的路徑
FIND_PROGRAM(<VAR>name1 path1 path2 …)   VAR變數代表包含這個程式的全路徑
FIND_PACKAGE(<name>[major.minor] [QUIET] [NO_MODULE] [[REQUIRED|COMPONENTS][componets...]])   用來呼叫預定義在CMAKE_MODULE_PATH下的Find<name>.cmake模組,也可以自己定義Find<name>模組,通過SET(CMAKE_MODULE_PATH dir)將其放入工程的某個目錄中供工程使用,後面會詳細介紹FIND_PACKAGE的使用方法和Find模組的編寫。
  • 1
  • 2
  • 3
  • 4
  • 5

FIND_LIBRARY示例:

FIND_LIBRARY(libXX11 /usr/lib)
IF(NOT libX)
    MESSAGE(FATAL_ERROR "libX not found")
ENDIF(NOT libX)
  • 1
  • 2
  • 3
  • 4

控制指令

IF指令,基本語法為:

IF(expression_r_r)
    #THEN section.
    COMMAND1(ARGS…)
    COMMAND2(ARGS…)ELSE(expression_r_r)
    #ELSE section.
    COMMAND1(ARGS…)
    COMMAND2(ARGS…)ENDIF(expression_r_r)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

另外一個指令是ELSEIF,總體把握一個原則,凡是出現IF的地方一定要有對應的ENDIF,出現ELSEIF的地方,ENDIF是可選的。表示式的使用方法如下:

IF(var)  如果變數不是:空, 0, N, NO, OFF, FALSE, NOTFOUND 或 <var>_NOTFOUND時,表示式為真。
IF(NOT var), 與上述條件相反。
IF(var1AND var2), 當兩個變數都為真是為真。
IF(var1OR var2), 當兩個變數其中一個為真時為真。
IF(COMMANDcmd), 當給定的cmd確實是命令並可以呼叫是為真。
IF(EXISTS dir) or IF(EXISTS file), 當目錄名或者檔名存在時為真。
IF(file1IS_NEWER_THAN file2), 當file1比file2新,或者file1/file2其中有一個不存在時為真檔名請使用完整路徑。
IF(IS_DIRECTORY dirname),  當dirname是目錄時為真。
IF(variableMATCHES regex)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

IF(string MATCHES regex) 當給定的變數或者字串能夠匹配正則表示式regex時為真。比如:

IF("hello" MATCHES "hello")
    MESSAGE("true")
ENDIF("hello" MATCHES "hello")
  • 1
  • 2
  • 3
IF(variable LESS number)
IF(string LESS number)
IF(variable GREATER number)
IF(string GREATER number)
IF(variable EQUAL number)
IF(string EQUAL number)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

數字比較表示式

IF(variable STRLESS string)
IF(string STRLESS string)
IF(variable STRGREATER string)
IF(string STRGREATER string)
IF(variable STREQUAL string)
IF(string STREQUAL string)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

按照字母序的排列進行比較。

IF(DEFINED variable),如果變數被定義,為真。 
一個小例子,用來判斷平臺差異:

IF(WIN32)
    MESSAGE(STATUS“This is windows.”) #作一些Windows相關的操作
ELSE(WIN32)
    MESSAGE(STATUS“This is not windows”) #作一些非Windows相關的操作
ENDIF(WIN32)
  • 1
  • 2
  • 3
  • 4
  • 5

上述程式碼用來控制在不同的平臺進行不同的控制,但是閱讀起來卻並不是那麼舒服, ELSE(WIN32)之類的語句很容易引起歧義。 
這就用到了我們在 常用變數 一節提到的CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS開關。可以SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTSON),這時候就可以寫成:

IF(WIN32)

ELSE()

ENDIF()
  • 1
  • 2
  • 3
  • 4
  • 5

如果配合ELSEIF使用,可能的寫法是這樣:

IF(WIN32)
    #dosomething related to WIN32
ELSEIF(UNIX)
    #dosomething related to UNIX
ELSEIF(APPLE)
    #dosomething related to APPLE
ENDIF(WIN32)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

WHILE指令

WHILE指令的語法是:

WHILE(condition)
    COMMAND1(ARGS…)
    COMMAND2(ARGS…)ENDWHILE(condition)
  • 1
  • 2
  • 3
  • 4
  • 5

其真假判斷條件可以參考IF指令。

FOREACH指令

FOREACH指令的使用方法有三種形式: 
(1)列表

FOREACH(loop_vararg1 arg2 …)
    COMMAND1(ARGS…)
    COMMAND2(ARGS…)ENDFOREACH(loop_var)
  • 1
  • 2
  • 3
  • 4
  • 5

像我們前面使用的AUX_SOURCE_DIRECTORY的例子

AUX_SOURCE_DIRECTORY(.SRC_LIST)
FOREACH(F ${SRC_LIST})
    MESSAGE(${F})
ENDFOREACH(F)
  • 1
  • 2
  • 3
  • 4

(2)範圍

FOREACH(loop_var RANGE total)

ENDFOREACH(loop_var)
  • 1
  • 2
  • 3

從0到total以1為步進,舉例如下:

FOREACH(VARRANGE 10)
    MESSAGE(${VAR})
ENDFOREACH(VAR)
  • 1
  • 2
  • 3

最終得到的輸出是:

0
1
2
3
4
5
6
7
8
9
10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

(3)範圍和步進

FOREACH(loop_var RANGE start stop [step])

ENDFOREACH(loop_var)
  • 1
  • 2
  • 3

從start開始到stop結束,以step為步進。舉例如下:

FOREACH(A RANGE 5 15 3)
    MESSAGE(${A})
ENDFOREACH(A)
  • 1
  • 2
  • 3

最終得到的結果是:

5
8
11
14
  • 1
  • 2
  • 3
  • 4

這個指令需要注意的是,直到遇到ENDFOREACH指令,整個語句塊才會得到真正的執行。

複雜的例子:模組的使用和自定義模組

這裡將著重介紹系統預定義的Find模組的使用以及自己編寫Find模組,系統中提供了其他各種模組,一般情況需要使用INCLUDE指令顯式的呼叫,FIND_PACKAGE指令是一個特例,可以直接呼叫預定義的模組。

其實純粹依靠cmake本身提供的基本指令來管理工程是一件非常複雜的事情,所以cmake設計成了可擴充套件的架構,可以通過編寫一些通用的模組來擴充套件cmake。

首先介紹一下cmake提供的FindCURL模組的使用,然後基於前面的libhello共享庫,編寫一個FindHello.cmake模組。 
(一)使用FindCURL模組 
在/backup/cmake目錄建立t5目錄,用於存放CURL的例子。 
建立src目錄,並建立src/main.c,內容如下:

#include<curl/curl.h>
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

FILE*fp;

intwrite_data(void *ptr, size_t size, size_t nmemb, void *stream)

{
    int written = fwrite(ptr, size, nmemb, (FILE *)fp);
    return written;
}

int main()
{
    const char *path = “/tmp/curl-test”;
    const char *mode = “w”;
    fp = fopen(path,mode);
    curl_global_init(CURL_GLOBAL_ALL);
    CURL coderes;
    CURL *curl = curl_easy_init();

    curl_easy_setopt(curl, CURLOPT_URL, “http://www.linux-ren.org”);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
    res = curl_easy_perform(curl);
    curl_easy_cleanup(curl);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

這段程式碼的作用是通過curl取回www.linux-ren.org的首頁並寫入/tmp/curl-test檔案中

建立主工程檔案CmakeLists.txt,如下:

PROJECT(CURLTEST)
ADD_SUBDIRECTORY(src)
  • 1
  • 2

建立src/CmakeLists.txt

ADD_EXECUTABLE(curltest main.c)
  • 1

現在自然是沒辦法編譯的,我們需要新增curl的標頭檔案路徑和庫檔案。

方法1: 
直接通過INCLUDE_DIRECTORIESTARGET_LINK_LIBRARIES指令新增:

我們可以直接在src/CMakeLists.txt中新增:

INCLUDE_DIRECTORIES(/usr/include)
TARGET_LINK_LIBRARIES(curltestcurl)
  • 1
  • 2

然後建立build目錄進行外部構建即可。 
現在要探討的是使用cmake提供的FindCURL模組。

方法2: 
使用FindCURL模組。向src/CMakeLists.txt中新增:

FIND_PACKAGE(CURL)
IF(CURL_FOUND)
    INCLUDE_DIRECTORIES(${CURL_INCLUDE_DIR})
    TARGET_LINK_LIBRARIES(curltest${CURL_LIBRARY})
ELSE(CURL_FOUND)
    MESSAGE(FATAL_ERROR”CURL library not found”)
ENDIF(CURL_FOUND)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

對於系統預定義的Find<name>.cmake模組,使用方法一般如上例所示,每一個模組都會定義以下幾個變數:

<name>_FOUND
<name>_INCLUDE_DIR or <name>_INCLUDES
<name>_LIBRARY or <name>_LIBRARIES
  • 1
  • 2
  • 3

可以通過<name>_FOUND來判斷模組是否被找到,如果沒有找到,按照工程的需要關閉某些特性、給出提醒或者中止編譯,上面的例子就是報出致命錯誤並終止構建。 
如果<name>_FOUND為真,則將<name>_INCLUDE_DIR加入INCLUDE_DIRECTORIES,將<name>_LIBRARY加入TARGET_LINK_LIBRARIES中。

我們再來看一個複雜的例子,通過<name>_FOUND來控制工程特性:

            
           

相關推薦

CMakeCMakeLists.txt編寫入門

自定義變數 主要有隱式定義和顯式定義兩種。  隱式定義的一個例子是PROJECT指令,它會隱式的定義< projectname >_BINARY_DIR和< projectname >_SOURCE_DIR兩個變數;顯式定義使用SET指令構建自定義變數,比如:SET(HELLO_

CmakeCMakeLists.txt

        我們知道makefile是在Linux編譯c或者c++程式碼的時候的一種指令碼檔案,但是每一個功能都要寫一個makefile檔案,這樣如果這個工程很大,而且相關性比較強的話,makefile的書寫就會變得相對繁瑣,更要命的是如果以後需要新增

Android studio中NDK開發(一):CMakeLists.txt編寫入門

自定義變數 主要有隱式定義和顯式定義兩種。  隱式定義的一個例子是PROJECT指令,它會隱式的定義< projectname >_BINARY_DIR和< projectname >_SOURCE_DIR兩個變數;顯式定義使用SE

ROS Catkin 教程 CMakeLists.txt

1. 概覽 CMakeLists.txt 是用 CMake 構建系統構建 ROS 程式包的輸入檔案。任何相容 CMake 的包都包含一個或多個 CMakeLists.txt 檔案,用以描述怎樣構建和安裝程式碼。catkin 專案採用標準的 vanilla CMa

CMakeLists.txt 編寫要點 && 一個關於install()的深坑

#PS:要轉載請註明出處,本人版權所有 #PS:這個只是 《 我自己 》理解,如果和你的 #原則相沖突,請諒解,勿噴 Linux 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UT

CMakeLists.txt編寫

一、新建一個src資料夾,裡面放入hello.c,hello.h,,main.c,CMakeLists.txt這四個檔案,這四個資料夾裡面的內容分別如下: 1.hello.c #include "hello.h" void hello_func(void) { printf("Hello W

ROS學習CMakelists.txt和package.xml

package.xml 當你的package裡已經包含配置檔案(package.xml),ROS能夠找到它。執行:rospack find [包名稱]。應該注意到我們剛才所建立的package.xml依賴於 roscpp 和 std_msgs.而catkin恰

CMakeLists.txt編寫和使用方法

一、使用方法  一般把CMakeLists.txt檔案放在工程目錄下,使用時,先建立一個叫build的資料夾(這個並非必須,只是生成的Makefile等檔案放在build裡比較整齊),然後執行下列操作:  cd build  cmake ..  make  其中cmake

Ubuntu下使用cmake結合CmakeLists.txt生成makefile檔案並進行編譯

1.CMake編譯原理CMake是一種跨平臺編譯工具,比make更為高階,使用起來要方便得多。CMake主要是編寫CMakeLists.txt檔案,然後用cmake命令將CMakeLists.txt檔案轉化為make所需要的makefile檔案,最後用make命令編譯原始碼生成可執行程式或共享庫(so(sha

Cmake知識----編寫CMakeLists.txt檔案編譯C/C++程式

1.CMake編譯原理 CMake是一種跨平臺編譯工具,比make更為高階,使用起來要方便得多。CMake主要是編寫CMakeLists.txt檔案,然後用cmake命令將CMakeLists.txt檔案轉化為make所需要的makefile檔案,最後用make

熟悉 CMake(二)—— 以一個例項說明 CMakeLists txt 檔案的編寫

原文請見 cmake使用總結(轉)—工程主目錄CMakeList檔案編寫 在 Linux 下進行開發很多人選擇編寫 makefile 檔案進行專案環境搭建,而makefile 檔案依賴關係複雜,工作量很大。採用自動化的專案構建工具 CMake 可以將程式設計師從複雜的 makefile 檔案中解脫

熟悉 CMake(二)—— 以一個實例說明 CMakeLists txt 文件的編寫

語法 項目構建工具 易懂 支持 list rec prope span 信息 原文請見 cmake使用總結(轉)—工程主目錄CMakeList文件編寫 在 Linux 下進行開發很多人選擇編寫 makefile 文件進行項目環境搭建,而makefile 文件依賴關系復雜

cpp eigen mkl cmake CMakeLists.txt 例項

project(XgboostTextMatch) SET(XgboostTextMatch_SRC JniTest.cpp LibForJni.cpp Session.cpp ../LibSimiSent.cpp ../CEditDistance.cpp ../CScipyDista

gcc- make- makefile-Cmake-CMakeLists.txt

1.gcc是GNU Compiler Collection(就是GNU編譯器套件),也可以簡單認為是編譯器,它可以編譯很多種程式語言(括C、C++、Objective-C、Fortran、Java等等)。 2.當你的程式只有一個原始檔時,直接就可以用gcc命令

Mac下CMakeLists.txt檔案的使用快速入門(一)

在用Cmake編譯檔案,發現需要自己動手寫CMakeLists.txt檔案,簡單研究了下,記錄如下: 一、介紹 CMake是一種跨平臺編譯工具,比make更為高階,使用起來要方便得多。CMake主要是編寫CMakeLists.txt檔案,然後用cmake命令將CMakeL

Putty基礎教程(一).入門命令學習及編寫HTML

Linux初學 轉自部落格點這裡 覺得大佬寫的超級好就轉載了 常見命令包括: cd 資料夾名 :檢視路徑 dir :檢視當前路徑下的所有檔案 ls :列出當前資料夾下所有內容 pwd :顯示當前路徑 clear : 清空終端螢幕命令,Ctrl+L清除螢幕 m

編寫支援多個編譯器的CMakeLists.txt

CMakeLists.txt cmake_minimum_required(VERSION 2.8.0) # in CMakeLists.txt root_dir: "mkdir build", "cd build", "cmake .." set(PROJECT_NAME "f

ROScatkin介紹(CMakeLists.txt 、package.xml)

http://docs.ros.org/jade/api/catkin/html/index.html http://docs.ros.org/hydro/api/catkin/html/howto/format2/building_msgs.html

CMake,make,CMakeLists.txt,CMakeFiles之間的關係

參考https://www.zhihu.com/question/36609459 對於一個只在windows界混的菜鳥程式設計師,平常用Visual Studio(號稱宇宙最強IDE),就能實現新建工程,編寫*.cpp,*.h,編譯(即build,這裡的編譯實際包括了編譯,彙編,連結等等,

does not appear to contain CMakeLists.txt在使用opencv和cmake

opencv284版本  cmake2.8版本   第一次configure時提示****does not appear to contain CMakeLists.txt    這時我的源目錄是D:/opencv/  但是 實際上這個檔案 CMakeLists.txt