我的工程目录如下:
│ CMakeLists.txt
├─cmake_tutorial
│ CMakeLists.txt
│ cmake_tutorial.cpp
│ cmake_tutorial.h
│
└─src
│ main.cc
│
├─bundle_sort
│ bundle_sort.cc
│ bundle_sort.h
│ CMakeLists.txt
│
└─common
CMakeLists.txt
declarations.h
tools.cc
tools.h
utils.cc
顶层的CMakeList解释如下:
# CMakeList.txt: 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目。
#
set(CMAKE_CXX_FLAGS "-std=c++11") # c++11
cmake_minimum_required (VERSION 3.8)
project ("cmake_tutorial")
#下面是编译选项,debug和Release模式的判断,需要注意的是关键字OR必须要大写
IF (CMAKE_BUILD_TYPE MATCHES "Debug" OR CMAKE_BUILD_TYPE MATCHES "DEBUG")
SET(COMPILE_FLAGS "-w -O0 -g3")
message("Debug mode")
ELSE()
SET(COMPILE_FLAGS "-w -O3 -g")
message("Release mode")
ENDIF()
# 把src里面的内容加入到SRC_DIR变量里面,注意,这个是从左到右的
aux_source_directory("./src" SRC_DIR)
# 执行shell命令,并把输出存到OUTPUT_VARIABLE指定的变量中
#execute_process(
# COMMAND bash -c "mysql_config --libs_r"
# OUTPUT_VARIABLE mysql_config_output
#)
# 如果增加多个源文件,那么这样写即可,自动会进行追加
#aux_source_directory("./src/common" SRC_DIR)
# .h文件的位置,相当于gcc编译里面的-I选项
#include_directories("./src" "./src/main")
# 需要链接的库文件目录,这里是目录,类似于LD_LIBRARY_PATH的作用,eg:LINK_DIRECTORIES("/opt/MATLAB/R2012a/bin/glnxa64")
#link_directories()
# 需要链接的库文件路径,注意,这里是全路径. eg: LINK_LIBRARIES("/opt/MATLAB/R2012a/bin/glnxa64/libeng.so")
# 注意和target_link_libraries的区别
#link_libraries()
# 包含子项目,子项目里面可能包含CMakeLists.txt文件,处理新的cmake
add_subdirectory("./src/bundle_sort")
add_subdirectory("./src/common")
# 相当于生成最后的一个可运行文件
add_executable(Cmake ${SRC_DIR})
# 增加编译选项
#add_definitions("-Wall -ansi")
# 专门用来打印消息的命令
#message("hello world. This is a print message!")
# 链接静态库
target_link_libraries(Cmake bundle_sort common)
# 连接静态库也可按照下面的方式书写
#target_link_libraries(tpcc_start -lrt -L/usr/local/mysql/lib -lmysqlclient -lpthread -lm -lssl -lcrypto -ldl)
# make install命令,表示将target Cmake二进制文件安装到SOURCE目录下(当然,实际不推荐这么做)
#install(TARGETS Cmake
# RUNTIME DESTINATION ${CMAKE_SOURCE_DIR})