C语言编译:CMakeLists.txt语句【01】
CMake 是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。他能夠輸出各種各樣的 Makefile 或者 project 文件,CMake 并不直接建構出最終的軟件,而是產生標準的建構件(如 Makefile 或 projects)。
CMake的語法晦澀難記,但是一些基本的構成需要知道,這樣其它語法不用死記,也是能夠快速解決編譯問題。本文以案例的方法,進行基本Cmake知識解釋。
一、命令:project(project-name)
這個命令不是強制性的,但最好都加上。它會引入兩個變量 project-name_BINARY_DIR 和 project-name_SOURCE_DIR,同時,cmake 自動定義了兩個等價的變量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。
1.1 創建工程目錄:
mkdir myCmake cd? myCmake mkdir build以上構建后,目錄如下:
./myCmake ├── CMakeLists.txt ├── build └── hello.cpp其中,CMakeLists.txt的代碼是
#給工程取一個名字
PROJECT (myCmake)
#打印
MESSAGE(STATUS "This is BINARY dir" ${myCmake_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir" ${myCmake_SOURCE_DIR})
MESSAGE(STATUS "This is PROJECT_SOURCE dir" ${PROJECT_SOURCE_DIR})
# 生成可執行的文件
ADD_EXECUTABLE(hello? hello.cpp)
以上紅色是本質的代碼:指定工程、指定編譯結果。
?其中,hello.cpp的代碼是:
#include <stdio.h> int main(int argc, char* argv[]){printf("Hello CMake!\n"); }1.2 編譯工程
輸入編譯指令
cd? myCmake/build cmake ..?工程的目錄變為:
./myCmake ├── CMakeLists.txt ├── build │?? ├── CMakeCache.txt │?? ├── CMakeFiles │?? ├── Makefile │?? └── cmake_install.cmake └── hello.cpp?可以看到,原本空的build多了幾個文件,這就是通過CMakeLists.txt生成的編譯檔;
繼續鍵入
make指令,最后編譯完成,生成可執行文件hello。
注意:以上cmake編譯在下級目錄./build中進行,而不在CMakeLists.txt所在目錄進行;這是一個路徑方便的問題。暫時不要追究,這種編譯法可以推廣到任何問題,因此值得死記硬背。?
二、?CMake的其它預定義變量
?
- PROJECT_SOURCE_DIR:工程根目錄;
- PROJECT_BINARY_DIR:運行cmake命令的目錄。筆者建議定義為${PROJECT_SOURCE_DIR}/build下。具體原因見后文外部編譯部分;
- CMAKE_INCLUDE_PATH:環境變量,非cmake變量;
- CMAKE_LIBRARY_PATH:環境變量;
- CMAKE_CURRENT_SOURCE_DIR:當前處理的CMakeLists.txt文件所在路徑;
- CMAKE_CURRENT_BINARY_DIR:target編譯目錄;
- 使用ADD_SURDIRECTORY指令可以更改該變量的值;
- SET(EXECUTABLE_OUTPUT_PATH < dir >) 指令不會對該變量有影響,但改變了最終目標文件的存儲路徑;
- CMAKE_CURRENT_LIST_FILE:輸出調用該變量的CMakeLists.txt的完整路徑;
- CMAKE_CURRENT_LIST_LINE:輸出該變量所在的行;
- CMAKE_MODULE_PATH:定義自己的cmake模塊所在路徑;
- EXECUTABLE_OUTPUT_PATH:重新定義目標二進制可執行文件的存放位置;
- LIBRARY_OUTPUT_PATH:重新定義目標鏈接庫文件的存放位置;
- PROJECT_NAME:返回由PROJECT指令定義的項目名稱;
- CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS:用來控制IF...ELSE...語句的書寫方式;
總結
以上是生活随笔為你收集整理的C语言编译:CMakeLists.txt语句【01】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ros知识:关于catkin_init_
- 下一篇: ROS知识:分析和改写小乌龟代码【01】