目录
1 CMakeLists.txt 怎么写
1.1 语句含义
cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。
CMakeLists.txt直接指定了程序的编译规则。
因为仅仅只是作为一个入门学习。我们的目标是
- 完成软件编译
- 完成静态库/共享库的建立
- 使用静态库/共享库
首先我们需要了解CMakeLists.txt中最常用的语句,注意,以下内容对于大小写并没有严格的要求,可以按照个人喜好修改:
- 指定cmake的最低版本,通常情况下它并没有那么重要
cmake_minimum_required(VERSION 3.0.2)
- 设置项目名称,运行这一句之后就会自动生成两个变量:${PROJECT_NAME}与${PROJECT_SOURCE_DIR},分别指的是项目名称与CMakeLists.txt所在目录
project(YOYO)
- 变量设置,前一个参数为变量名,后一个参数为变量指代的路径,例如下面这个例子中就用EXECUTABLE_OUTPUT_PATH变量代表了${PROJECT_BINARY_DIR}/bin路径
set(EXECUTABLE_OUTPUT_PATH ${
PROJECT_BINARY_DIR}/bin)
- 将目录下所有文件给到变量中,值得注意的是这里面的变量可以包含多个路径
aux_source_directory(
./src/shared/src SHARED_SRC
)
- 设置子目录,下面这个例子中就把当前目录下的src目录指定成了子目录,这个语句会执行指定子目录的CMakeLists.txt,并且子目录的CMakeLists.txt中可以使用父目录CMakeLists.txt中设置的变量
add_subdirectory(./src)
- 设定头文件的路径,这样可执行文件就能够#include到这里指定路径下的头文件
include_directories(
./include
)
- 设置可执行文件,下面的例子中将src目录下的main.cpp设置成了可执行文件,生成的可执行文件名为${PROJECT_NAME}
add_executable( ${
PROJECT_NAME}
./src/main.cpp
)
- 设置链接库的路径
link_directories(
/path/lib
)
- 指定要使用的库,在linux中,.a文件是静态库,.so文件是共享库,也称动态库
target_link_libraries(${
PROJECT_NAME}
libname.a
libname.so
)
- 将文件打包成链接库,第一个参数是链接库的名称(例如耳熟能详的OpenCV),第二个参数是链接库类型,可以是STATIC(静态库)、SHARED(共享库)、PUBLIC(俺不知道了,公共库吗?),第三个参数是打包成链接库的文件,可以用aux_source_directory命令弄出一大堆文件然后一起输进去
add_library(LIB_NAME SHARED ${
SHARED_SRC})
1.2 一些实例
当我自己查资料学习的时候看了大量的语句说明,并不能很好地理解,其实在实例中逐步了解效果会好很多,所以这里我们尝试给出一些实例。
1.2.1 创建一个可执行文件
- 我们在工作目录下创建一个src文件夹用于存放cpp文件,build文件夹作为二进制目录(就理解成装cmake产生的文件吧),再创建一个CMakeLists.txt
.
├── build
├── CMakeLists.txt
└── src
└── main.cpp
其中main.cpp文件是一个最简单的hello world程序。CMakeLists.txt内容如下
cmake_minimum_required(VERSION 3.0.2)
project(EXAMPLE)
set(EXECUTABLE_OUTPUT_PATH ${
PROJECT_BINARY_DIR}/bin)
add_executable(${
PROJECT_NAME}
${
PROJECT_SOURCE_DIR}/src/main.cpp
)
2 在指定了最小版本、项目名以后,我们先将可执行文件的输出路径指定成${PROJECT_BINARY_DIR}/bin
其中${PROJECT_BINARY_DIR}就是指的build文件夹
然后我们设定src目录下的main.cpp为可执行文件
使用以下命令进行编译
cd ./build
cmake ..
make