在linux中编写C++代码时,使用cmake能够更好的管理编译我们编写的代码,下面我将编写CMakeLists.txt基本的框架
main.cpp
#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
cout<<"Hello World!"<<endl;
return 0;
}
vim CMakeLists.txt
PROJECT(TEST) //工程名
CMAKE_MINIMUM_REQUIRED(VERSION 2.8) //cmake版本的要求
SET(SRC_LIST main.cpp) //源文件
MESSAGE(STATUS "This is a demo") //执行cmake 命令时添加打印信息
ADD_EXECUTABLE(test ${SRC_LIST}) //test 为可执行文件名,将SRC_LIST(所有的源文件)编译成可执行文件test
在当前目录下新建一个build目录
>mkdir build
>cd build
>cmake ..
就会在build目录下生成cmake相关的文件,以及生成makefile,然后执行make命令,就会生成可执行文件test
>make
上面只是一个简单CMakeLists的编写
如果要添加相应的库目录,以及include目录
例如使用OCCI连接Oracle数据库,要添加occi include目录
SET(OCCI_INCLUDE "/usr/include/oracle/12.1/client64")
INCLUDE_DIRECTORIES(${OCCI_INCLUDE})
LINK_DIRECTORIES(/usr/lib/oracle/12.1/client64/lib)
链接库文件
SET(REQ_LIB occi sqlplus pthread)
TARGET_LINK_LIBRARIES(test ${REQ_LIB})
在每个.cpp目录都需要有一个CMakeLists.txt文件
生成共享库
SET(LIBHELLO_SRC main.cpp)
ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) //生成动态库
ADD_LIBRARY(hello STATIC ${LIBHELLO_SRC}) //生成静态库
执行cmake命令将会生成libhello.so共享库
SET_TARGET_PROPERTIES(hello PROPERTIESVERSION1.2SOVERSION 1)
VERSION 指代动态库版本,SOVERSION 指代 API 版本。
将上述指令加入 lib/CMakeLists.txt 中,重新构建看看结果。
在 build/lib 目录会生成:
libhello.so.1.2
libhello.so.1->libhello.so.1.2
libhello.so ->libhello.so.1
TARGET_LINK_LIBRARIES(main libhello.so)
这里的 hello 指的是我们上一节构建的共享库 libhello.
添加编译选项,编译成Debug版本或者Release版本
OPTION(DEBUG
"Build the project using debugging mode"
OFF)
IF(DEBUG)
MESSAGE(STATUS "Adding Debug flag...")
ADD_DEFINITIONS(-D_DEBUG -DDEBUG -O0 -g -ggdb)
SET(CMAKE_BUILD_TYPE Debug)
SET(BTYPE ${CMAKE_BUILD_TYPE})
MESSAGE(STATUS "Build type is " ${CMAKE_BUILD_TYPE})
ELSE(DEBUG)
MESSAGE(STATUS "Adding Release flag...")
ADD_DEFINITIONS(-D_RELEASE -DRELEASE -O3)
SET(CMAKE_BUILD_TYPE Release)
SET(BTYPE ${CMAKE_BUILD_TYPE})
MESSAGE(STATUS "Build type is " ${CMAKE_BUILD_TYPE})
ENDIF(DEBUG)
编译时
cmake .. -DDEBUG=ON //编译DEBUG版本
cmake .. -DDEBUG=OF //编译Release版本
AUX_SOURCE_DIRECTORY
基本语法是:
AUX_SOURCE_DIRECTORY(dir VARIABLE)
作用是发现一个目录下所有的源代码文件并将列表存储在一个变量中,这个指令临时被用来
自动构建源文件列表。因为目前 cmake 还不能自动发现新添加的源文件。
比如
AUX_SOURCE_DIRECTORY(.SRC_LIST)
ADD_EXECUTABLE(main ${SRC_LIST})