2. CMake 系列 - 編譯多文件項目


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


免責聲明!

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



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