1. 編譯不使用第三方庫的項目
1.1 項目目錄結構
test/
├── build
├── CMakeLists.txt
└── src
├── include
│ └── sub │ └── sub.h ├── init │ └── main.c └── sub └── sub.c
博主一般寫項目都是以這種風格進行划分目錄,這個風格也是參考內核風格。
build
: 存放 cmake 生成的相關文件和make 編譯生成的相關中間文件
CMakeLists.txt
: 使用cmake 語法編寫這個文件,cmake 負責將其轉換為相對應makefile
src
: 存放源代碼
include
: 存放每個模塊頭文件,每個模塊都有自己的目錄;
1.2 相關代碼
sub.h
#ifndef _SUB_H #define _SUB_H int sub(const int a, const int b); #endif
sub.c
#include "sub/sub.h" int sub(const int a, const int b) { return a - b; }
main.c
#include "sub/sub.h" #include <stdio.h> int main(int argc, char **argv) { int num = sub(10, 8); printf("10 - 8 = %d\n", num); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(project-1) message("Project Name: " ${PROJECT_NAME}) #設置編譯參數 set(CMAKE_C_FLAGS "-g -Wall") #設置執行文件輸出目錄 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 添加頭文件路徑 include_directories(${PROJECT_SOURCE_DIR}/src/include) # 遞歸獲取目錄下所有的C文件 file(GLOB_RECURSE c_files ${PROJECT_SOURCE_DIR}/src/*.c) # 生成執行文件 add_executable(${PROJECT_NAME} ${c_files})
1.3 編譯
進入test目錄
$ cd test $ cd build $ cmake .. $ make $ cd .. $ tree bin
編譯后生成執行文件
bin
└── project-1
運行秩序文件
$ cd bin $ ./ project-1 10 - 8 = 2
2. 編譯使用第三方庫的項目
2.1 項目目錄結構
test1
├── build
├── CMakeLists.txt
└── src
├── include
│ └── sub
│ └── sub.h
├── init
│ └── main.c
├── lib
│ └── add │ ├── include │ │ └── add.h │ └── lib │ └── libadd.a └── sub └── sub.c
build
: 存放 cmake 生成的相關文件和make 編譯生成的相關中間文件
CMakeLists.txt
: 使用cmake 語法編寫這個文件,cmake 負責將其轉換為相對應makefile
src
: 存放源代碼
include
: 存放每個模塊頭文件,每個模塊都有自己的目錄;
lib
: 存放第三庫的頭文件和lib文件,若是使用多個第三方庫,則需分為不同的目錄存放。
2.2 相關代碼
sub.h
#ifndef _SUB_H #define _SUB_H int sub(const int a, const int b); #endif
sub.c
#include "sub/sub.h" int sub(const int a, const int b) { return a - b; }
add.h
#ifndef _ADD_H #define _ADD_H int add(const int a, const int b); #endif
main.c
#include "sub/sub.h" #include "add.h" #include <stdio.h> int main(int argc, char **argv) { int a = 10; int b = 8; printf("%d - %d = %d\n", a, b, sub(a, b)); printf("%d + %d = %d\n", a, b, add(a, b)); return 0; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.6) project(project-2) message("Project Name: " ${PROJECT_NAME}) #設置編譯參數 set(CMAKE_C_FLAGS "-g -Wall") #設置執行文件輸出目錄 set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 添加頭文件路徑 include_directories(${PROJECT_SOURCE_DIR}/src/include) # 添加第三方庫(add)頭文件路徑 include_directories(${PROJECT_SOURCE_DIR}/src/lib/add/include) #添加庫文件搜索路徑 link_directories(${PROJECT_SOURCE_DIR}/src/lib/add/lib) # 遞歸獲取目錄下所有的C文件 file(GLOB_RECURSE c_files ${PROJECT_SOURCE_DIR}/src/*.c) # 生成執行文件 add_executable(${PROJECT_NAME} ${c_files}) # 執行文件鏈接外部庫文件 target_link_libraries(${PROJECT_NAME} add)
2.3 編譯
進入test1目錄
$ cd test1 $ cd build $ cmake .. $ make $ cd .. $ tree bin
編譯后生成執行文件
bin
└── project-2
運行執行文件
$ cd bin $ ./ project-2 10 - 8 = 2 10 + 8 = 18
出處:https://www.cnblogs.com/standardzero/p/10781223.html