前言
这篇博客是我对cmake
用法的一些经验总结, 还很浅显, 如果有错误或者更好的方案, 欢迎指正~
使用方法统一为在build
目录中执行:
$: cmake ..
$: make
我觉得养成外部编译是一个好习惯
例一
目录结构为:
lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_1$ tree
.
├── build
├── CMakeLists.txt
└── src
├── hello
│ ├── hello.cc
│ └── hello.h
├── main.cpp
└── world
├── world.cc
└── world.h
src 目录中不同属性类维护在不同目录中
main.cpp
中使用hello.h
和world.h
CMakeLists.txt
为 :
cmake_minimum_required (VERSION 3.0)
project (test_1)
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src/hello SOURCE_HELLO)
aux_source_directory(${CMAKE_CURRENT_LIST_DIR}/src/world SOURCE_WORLD)
add_definitions("-g -Wall -std=c++11")
add_executable(main
${CMAKE_CURRENT_LIST_DIR}/src/main.cpp
${SOURCE_HELLO}
${SOURCE_WORLD})
例二
目录结构为:
lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_2$ tree
.
├── build
├── CMakeLists.txt
├── include
│ └── person.h
└── src
├── main.cpp
└── person.cc
include
目录下统一包含头文件和宏定义之类, 源文件放在 src 目录下维护
person 类是一个简单的空类, 拥有一个私有成员变量val
, 一个公有成员函数来打印该变量, 在main.cpp
中调用
CMakeLists.txt
为 :
cmake_minimum_required(VERSION 3.0)
project(test_2)
include_directories(${PROJECT_SOURCE_DIR}/include)
add_definitions("-g -Wall -std=c++11")
add_executable(main
${PROJECT_SOURCE_DIR}/src/main.cpp #这个路径看这个main.cpp位于哪里了
${PROJECT_SOURCE_DIR}/src/person.cc)
-----update:
在多线程的代码上使用我上面的CMakeLists发现有问题,add_definitions
发现并不能这么用,正确用法后面再学习吧, 在一人的博客上看到一更正确的, 如下
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 ) #设定最小版本号
PROJECT( test ) #设定工程名
SET(CMAKE_CXX_COMPILER "g++") #设置编译器(可选的有gcc,g++)
# 设置用debug还是release模式。debug允许断点,而release更快
#set( CMAKE_BUILD_TYPE Debug )
set( CMAKE_BUILD_TYPE Release )
`就是这里,多线程的编译标志,即编译选项应该这么用`
# 设置编译选项
# 允许c++11标准、O3优化、多线程。match选项可避免一些cpu上的问题
set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -march=native -O3 -pthread" )
#设定可执行二进制文件的目录
SET( EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#设定存放编译出来的库文件的目录
SET( LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
#并且把该目录设为连接目录
LINK_DIRECTORIES( ${PROJECT_SOURCE_DIR}/lib)
#设定头文件目录
INCLUDE_DIRECTORIES( ${PROJECT_SOURCE_DIR}/include)
#增加子文件夹(注意我们的src路径是通过子文件夹的形式添加的,在这里面也是可以些CMakeLists.txt的)
ADD_SUBDIRECTORY( ${PROJECT_SOURCE_DIR}/src)
例三
目录结构为:
lzj@lzj:~/C-Plus-Plus/makefile_cmake/cmake_3$ tree
.
├── build
├── CMakeLists.txt
├── main.cpp
└── src
├── CMakeLists.txt
├── hello.cc
├── hello.h
├── world.cc
└── world.h
将编写的代码编译为库, 在main.cpp中使用, 编译main.cpp时链接该库
顶层目录中CMakeLists.txt
为:
cmake_minimum_required (VERSION 3.0)
project (test_3)
add_subdirectory(src)
add_definitions("-g -Wall -std=c++11")
add_executable(main main.cpp)
target_link_libraries(main TEST3) #自己的库名为TEST3
子目录 src 中的CMakeLists.txt
为:
aux_source_directory(. DIR_LIB_SRCS)
add_library (TEST3 ${DIR_LIB_SRCS})
当然如果src目录下为多文件时, 每个目录下都要添加该语句的CMakeLists.txt