CMakeLists.txt
- CMakeLists 例子1:
- CMakeLists语法1:include_directories
- CMakeLists语法2:add_library 将指定的源文件生成链接文件, 即是如何构建一个库供他人使用。完成这个任务需要用到ADD_LIBRARY()
- CMakeLists语法3:add_executable 使用指定的源文件来生成目标可执行文件
- CMakeLists语法4:target_link_libraries 该指令的作用为将目标文件与库文件进行链接
- cmake 变量引用的方式 --- ${} 进行变量的引用
- cmake 常用变量
- 设置编译选项
- cmakelist link_directories 添加需要链接的库文件目录
- opencv 库1
- opencv 库2
- CMakeLists中的add_definitions函数
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 ...])
[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>)
使用指定的源文件来生成目标可执行文件。这里的目标可执行文件分为三类:普通可执行目标文件、导入可执行目标文件、别名可执行目标文件。分别对应上面的三种命令格式。
CMakeLists语法4:target_link_libraries 该指令的作用为将目标文件与库文件进行链接
target_link_libraries(Static_Lib StaticBubble)
target_link_libraries(<target> [item1] [item2] [...]
[[debug|optimized|general] <item>] ...)
该指令的作用为将目标文件与库文件进行链接。上述指令中的
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")
cmakelist link_directories 添加需要链接的库文件目录
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