2.CMakeシリーズ-マルチファイルプロジェクトのコンパイル

10511 ワード

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 


int main(int argc, char **argv)
{
    int num = sub(10, 8); printf("10 - 8 = %d
", 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:第3ライブラリのヘッダファイルと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 


int main(int argc, char **argv) { int a = 10; int b = 8; printf("%d - %d = %d
", a, b, sub(a, b)); printf("%d + %d = %d
", 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コンパイル


test 1ディレクトリへ
$ 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