目录
环境
Debian 9
cmake version 3.7.2
CMakeLists.txt
cmake 主要通过 CMakeLists.txt 文件生成编译所需文件,子目录也需包含 CMakeLists.txt 文件。废话不多说,直接上 CMakeLists.txt 文件中的常用内容
- 主目录内容
cmake_minimum_required (VERSION 2.8)
set(PRO_NAME cmake_demo)
project (${PRO_NAME})
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(. DIR_SRCS)
#这里不使用CMAKE_BUILD_TYPE ,自定义make_type 来修改编译参数
#set(CMAKE_BUILD_TYPE Release)
set(CMAKE_CXX_FLAGS "-Wall -static")
set(make_type Release1)
if(${make_type} STREQUAL Release1)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -DNDEBUG")
message(STATUS "CMAKE_C_FLAGS or CMAKE_CXX_FLAGS : ${CMAKE_CXX_FLAGS}")
elseif(${make_type} STREQUAL Release2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Dctest")
message(STATUS "CMAKE_C_FLAGS or CMAKE_CXX_FLAGS : ${CMAKE_CXX_FLAGS}")
elseif(${make_type} STREQUAL Debug)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
message(STATUS "CMAKE_C_FLAGS or CMAKE_CXX_FLAGS : ${CMAKE_CXX_FLAGS}")
else()
message(FATAL_ERROR "make_type configuration error.")
endif()
set(CMAKE_C_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_C_COMPILER "arm-linux-gnueabihf-gcc")
set(CMAKE_CXX_COMPILER "arm-linux-gnueabihf-g++")
#添加头文件与链接库文件地址
message(STATUS "${CMAKE_CURRENT_SOURCE_DIR}")
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/glog/include)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/glog/lib)
#添加子目录头文件
include_directories(./src)
# 添加 src 子目录
add_subdirectory(src)
#option可使用 ccmake 来修改其定义 ON or OFF,此处默认 ON
option(MESSAGE_IF "MESSAGE_IF configuration" ON)
if(MESSAGE_IF)
message(STATUS "MESSAGE_IF is ON")
else()
message(STATUS "MESSAGE_IF is OFF")
endif()
# 指定生成目标
add_executable(${PRO_NAME} ${DIR_SRCS})
# 添加链接库
target_link_libraries(${PRO_NAME}
# -static #此处也可定义静态编译
cmake_test2
-lglog #也可以写成glog
-lpthread
)
#set(CMAKE_EXE_LINKER_FLAGS "-static") #此处也可定义静态编译
#add_definitions(-DNDEBUG) #此处也可定义部分编译参数
#修改安装位置
set(CMAKE_INSTALL_PREFIX ./output CACHE PATH "change install path" FORCE)
#定义安装文件位置
install (TARGETS ${PRO_NAME} DESTINATION bin)
#install (FILES "${PROJECT_BINARY_DIR}/config.h" DESTINATION include)
- 子目录内容
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_LIB_SRCS 变量
aux_source_directory(. DIR_LIB_SRCS)
# 生成链接库
add_library (cmake_test2 ${DIR_LIB_SRCS})
# 指定 cmake_test2 库的安装路径
install (TARGETS cmake_test2 DESTINATION lib)
install (FILES cmake_test2.h DESTINATION include)
文件树
├── CMakeLists.txt
├── cmake_test.cpp
├── glog
│ ├── include
│ │ └── glog
│ │ ├── export.h
│ │ ├── logging.h
│ │ ├── log_severity.h
│ │ ├── platform.h
│ │ ├── raw_logging.h
│ │ ├── stl_logging.h
│ │ └── vlog_is_on.h
│ └── lib
│ ├── cmake
│ │ └── glog
│ │ ├── glog-config.cmake
│ │ ├── glog-config-version.cmake
│ │ ├── glog-modules.cmake
│ │ ├── glog-targets.cmake
│ │ └── glog-targets-noconfig.cmake
│ ├── libglog.a
│ ├── libglog.so -> libglog.so.1
│ ├── libglog.so.0.6.0
│ ├── libglog.so.1 -> libglog.so.0.6.0
│ └── pkgconfig
│ └── libglog.pc
└── src
├── CMakeLists.txt
├── cmake_test2.cpp
└── cmake_test2.h
其中 glog 目录为上一篇文章所编译的链接库,src 目录为子目录,定义下相关需调用的函数,cmake_test.cpp 文件所在 main 函数
cmake_test.cpp
#include <iostream>
#include <glog/logging.h>
#include "cmake_test2.h"
int main(int argc, char **argv) {
FLAGS_logtostderr = true;
//FLAGS_alsologtostderr = true;
google::InitGoogleLogging(argv[0]);
FLAGS_log_dir = "./";
glog_print(500); //调用src文件夹中的函数
LOG(INFO) << "INFO";
LOG(WARNING) << "WARNING";
DLOG(ERROR) << "ERROR";
//LOG(FATAL) << "FATAL"; //执行则退出程序
#if ctest
DCHECK(!FLAGS_logtostderr) << "DCHECK"; //检查括号内部为真,否则退出程序
#endif
DLOG_IF(INFO, true) << "DLOG_IF"; //条件成立打印
DCHECK_EQ(FLAGS_alsologtostderr,0) << "DCHECK_EQ"; 检查括号内部相等,否则退出程序
return 0;
}
编译安装命令
进入工程目录,使用以下命令
#使用命令生成编译目录 _build
cmake -H. -B_build
#使用命令编译,在目录 _build 下生成对应文件
cmake --build _build/
#将文件安装在目录 _build/output 下
cmake --build _build/ --target install
仓库
完整测试例程在 GitHub 地址:
https://github.com/feitingfj/cmake_demo
参考
https://zhjwpku.com/2019/11/15/cmake-basic-commands-intro.html
https://blog.csdn.net/qq26983255/article/details/83303606
https://www.hahack.com/codes/cmake/