CMakeLists.txt

CMakeLists 例子1:

文件目录

├── CMakeLists.txt
├── include
│   └── StaticBubble.h
└── src
    ├── StaticBubble.cpp
    └── testBubble.cpp

StaticBubble.h

#include <iostream>
using namespace std;
void bubbleSort(int array[], int num);

StaticBubble.cpp

#include <iostream>
using namespace std;
void bubbleSort(int array[], int num){
    for(int i = 0; i < num; i++){
        for(int j = 0; j < num - i - 1; j++){
            if(array[j] > array[j + 1]){
                int temp = array[j];
                array[j] = array[j + 1];
                array[j + 1] = temp;
            }
        }
    }
}

testBubble.cpp

#include <iostream>
#include <StaticBubble.h>
 
using namespace std;
 
int main(int argc, char **argv){
    int array[5] = {32,54,38,65,98};
    bubbleSort(array, 5);
    for(int i = 0; i < 5; i++){
        cout << array[i] << '\t';
    }
    cout << endl;
 
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(Static_Lib)
 
set(CMAKE_CXX_STANDARD 11)
 
include_directories(include)
add_library(StaticBubble SHARED src/StaticBubble.cpp)   #STATIC  or SHARED

add_executable(Static_Lib src/testBubble.cpp)
target_link_libraries(Static_Lib StaticBubble)

在目录下新建文件夹build,并编译

mkdir build
cd build
cmake ..
make

在build文件夹下生成如下:

.
├── CMakeCache.txt
├── CMakeFiles
├── cmake_install.cmake
├── libStaticBubble.so
├── Makefile
└── Static_Lib

运行:

./Static_Lib

显示如下:

/tmp/test/build$ ./Static_Lib
32	38	54	65	98

CMakeLists语法1:include_directories

include_directories(include)

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

添加编译器用于查找头文件的文件夹,如果文件夹路径是相对路径,则认为该路径是基于当前源文件的路径。
将给定目录加给编译器搜索到的包含文件 .默认情况下,加到目录列表的最后. 通过设定 CMAKE_include_directories_BEFORE 为 ON 来改变. 通过使用 BEFORE or AFTER 可以加在前面或者后面. 如果设定 SYSTEM 选项 编译器认定为系统包含目录.

CMakeLists语法2:add_library 将指定的源文件生成链接文件, 即是如何构建一个库供他人使用。完成这个任务需要用到ADD_LIBRARY()

add_library(StaticBubble SHARED src/StaticBubble.cpp) #STATIC or SHARED

add_library(<name> [STATIC | SHARED | MODULE]
            [EXCLUDE_FROM_ALL]
            source1 [source2 ...])

:库的名字,直接写名字即可,不要写lib,会自动加上前缀的哈。
[STATIC | SHARED | MODULE] :类型有三种。
SHARED,动态库
STATIC,静态库
MODULE,在使用 dyld 的系统有效,如果不支持 dyld,则被当作 SHARED 对待。
EXCLUDE_FROM_ALL:这个库不会被默认构建,除非有其他的组件依赖或者手工构建。
上述例子中,
add_library(StaticBubble SHARED src/StaticBubble.cpp) #STATIC or SHARED
这句话就是生成了libStaticBubble.so

CMakeLists语法3:add_executable 使用指定的源文件来生成目标可执行文件

add_executable(Static_Lib src/testBubble.cpp)

add_executable (<name> [WIN32] [MACOSX_BUNDLE]
      [EXCLUDE_FROM_ALL]
      [source1] [source2 ...])
add_executable (<name> IMPORTED [GLOBAL])
add_executable (<name> ALIAS <target>)

使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:普通可执行目标文件、导入可执行目标文件、别名可执行目标文件。分别对应上面的三种命令格式。

target_link_libraries(Static_Lib StaticBubble)

target_link_libraries(<target> [item1] [item2] [...]
                      [[debug|optimized|general] <item>] ...)

该指令的作用为将目标文件与库文件进行链接。上述指令中的是指通过add_executable()和add_library()指令生成已经创建的目标文件。而[item]表示库文件没有后缀的名字。默认情况下,库依赖项是传递的。当这个目标链接到另一个目标时,链接到这个目标的库也会出现在另一个目标的连接线上。这个传递的接口存储在interface_link_libraries的目标属性中,可以通过设置该属性直接重写传递接口。

cmake 变量引用的方式 --- ${} 进行变量的引用

使用 ${} 进行变量的引用。在 IF 等语句中,是直接使用变量名而不通过 ${} 取值。

include_directories(${CMAKE_SOURCE_DIR}/include)

add_executable(tmp_test tmp_test.cpp ${TMP1_SRC} ${TMP2_SRC} ${TMP3_SRC} ${TMP4_SRC} ${TMP5_SRC} ${TMP6_SRC})
target_link_libraries(tmp_test ${TEST_LINK_LIBS})

cmake 常用变量

CMAKE_SOURCE_DIR 顶级CMakeLists.txt的文件夹

设置编译选项

CMAKE_C_FLAGS 设置 C 编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
CMAKE_CXX_FLAGS 设置 C++编译选项,也可以通过指令 ADD_DEFINITIONS()添加。
例如:

set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Wreturn-type -Wfloat-equal")
set(CMAKE_CXX_FLAGS "$ENV{CXXFLAGS} -Werror=empty-body -Werror=uninitialized")
link_directories(directory1 directory2 ...)

它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。
例如:

include_directories("/data_1/Anaconda1105/include")
link_directories("/data_1/Anaconda1105/lib")

opencv 库1

find_package(OpenCV REQUIRED)
include_directories("/home/yhl/software_install/opencv3.2/include")
link_directories(${OpenCV_LIBRARIES_DIRS})

CUDA_ADD_EXECUTABLE(julia_gpu julia_gpu.cu)
SET_PROPERTY(TARGET julia_gpu  PROPERTY FOLDER chapter04)
TARGET_LINK_LIBRARIES(julia_gpu ${OpenCV_LIBS})

opencv 库2

set(OpenCV_DIR "/home/yhl/software_install/opencv3.2/share/OpenCV")
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})

CUDA_ADD_EXECUTABLE(julia_gpu julia_gpu.cu)
SET_PROPERTY(TARGET julia_gpu  PROPERTY FOLDER chapter04)
TARGET_LINK_LIBRARIES(julia_gpu ${OpenCV_LIBS})

CMakeLists中的add_definitions函数

这种可以在我们更改别人代码做实验时使用,既不对其源码进行破坏,又可以添加自己的功能。之前都是在程序中进行#define,有了这个后可以直接在编译的时候进行选择。具体的,在工程CMakeLists.txt 中,使用add_definitions()函数控制代码的开启和关闭:

option(TEST_DEBUG "option for debug" OFF)
if (TEST_DEBUG) 
	add_definitions(-DTEST_DEBUG)
endif(TEST_DEBUG)

在源码中就可以使用:

#ifdef TEST_DEBUG
...
...
#else 
...
#endif
posted @ 2021-01-04 19:26  无左无右  阅读(357)  评论(0编辑  收藏  举报