cmake包含预定义变量和基本指令。其中,cmake的基本指令是不区分大小写的,即:cmake_minimum_required (VERSINON 1)
与CMAKE_MINIMUM_required(VERSION 1)
等价,随自己的习惯可自由选择。
例子1:
#最低版本要求
cmake_minimum_required(VERSION 2.8)
project(T)
设置变量名。即SRC=main.cpp
set(SRC main.cpp)
执行cmake时,打印相关信息,cmake的指令不区分大小写,如这里的message status
message(STATUS "This is the binary dir:" ${PROJECT_BINARY_DIR})
MESSAGE(status "This is the source dir:" ${PROJECT_SOURCE_DIR})
使用C++11 标准编译。CMAKE_CXX_FLAGS为指令集
set(CMAKE_CXX_FLAGS “-std=c++11”)
生成可执行文件
add_executable(t1 ${SRC})
将一份名为main.cpp
的源文件放在与该CMakeLists.txt
同目录下,执行mkdir build && cd build
和cmake .. && make
即可生成文件名为t1
的可执行文件。
例子2:
首先说明该例子包含两个目录,工程目录取名proj
,源文件目录取名src
,即src
是proj
的子目录,src
目录中包含源码文件。
先看src
中的CMakeLists.txt
#第二级目录中可不加cmake版本要求
#cmake_minimum_required(VERSION 3.7)
只是将当前目录下的main.cpp文件用target代替
set(target main.cpp)
将该目录下所有源文件统一用target代替。
aux_source_directory(./ target)
设置生成可执行文件的位置,对应于build中的bin目录下
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
add_executable(t2 ${target})
在看看工程目录下的CMakeLists.txt
:
#顶层的cmake文件添加加版本要求
cmake_minimum_required (VERSION 3.7)
#最外层包含项目名称
project(t2)
添加目录包含目录
add_subdirectory(src)
需要说明的是:将所有源码文件放在src
目录之下,其中${PROJECT_BINARY_DIR}
是常用的cmake
的变量名,表示所生成二进制文件目录,${}
表示取值,EXECUTABLE_OUTPUT_PATH
表示可执行文件的输出路径,他也是cmake
自带的变量。
例子3:
工程文件名依然为proj
,该目录之下包含lib_hello
文件和顶层的CMakeLists.txt
。lib_hello
里边包含源码文件和该目录的CMakeLists.txt
文件.
lib_hello文件的CMakeLists.txt
内容如下:
#为该目录下所有文件其别名为SRC
aux_source_directory(./ SRC)
生成动态链接库,库名字叫做hello_shared,SHARED是动态库的标记符号,${SRC}表示取SRC所包含的所有文件
add_library(hello_shared SHARED ${SRC})
同理,生成静态链接库,动态库和静态库的名字不能重名
add_library(hello_static STATIC ${SRC})
设置生成库的名称
set_target_properties(hello_static PROPERTIES OUTPUT_NAME "hellos")
set_target_properties(hello_shared PROPERTIES OUTPUT_NAME "hellod")
设置动态库的版本号
set_target_properties(hello_shared PROPERTIES VERSION 1.1 SOVERSION 1)
设置库文件路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
cmake_minimum_required(VERSION 3.7)
project(t3)
ADD_SUBDIRECTORY(lib_hello)
例子4:
首先说明的是:例4是在例子3的基础上进一步深入,这里用到了例子3生成的库,把该库当做已知。
首先项目目录t4
,其包含子目录src
,src
b包含源码文件吗,其中的源码文件用到了例子3中的头文件.
在src
中,主函数如下:
#include
int main()
{
Hello();
return 0;
}
src
目录中的cmake文件如下:
aux_source_directory(./ SRC)
填加非标准的共享库链接路径。一定在add_executable之间
link_directories(/home/yxg/bishiti/cmake/t3/build/bin)
add_executable(t4 ${SRC})
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
设置路径.这里的CMAKE_PROJECT_DIR并非cmake自带的变量,而是自己定义的
set(CMAKE_PROJECT_DIR /home/yxg/bishiti/cmake)
包含路径
include_directories(${CMAKE_PROJECT_DIR}/t3/lib_hello)
链接动态库
target_link_libraries(t4 hellod)
TARGET_LINK_LIBRARIES(t4 libhellos.a) # 链接静
cmake_minimum_required (VERSION 3.2)
project(t4)
add_subdirectory(src)
通过例子4,我们就可以使用自己所编写的库了!!