CMake学习

CmakeLists.txt

cmake 添加头文件目录,链接动态、静态库

模板一(来自: CMakeLists.txt编写和使用方法)

# 声明要求的cmake最低版本
cmake_minimum_required( VERSION 2.8 )

# 添加c++11标准支持
set( CMAKE_CXX_FLAGS "-std=c++11" )

# 声明一个cmake工程
project( 工程名 )

# 找到后面需要库和头文件的包
find_package(包的名称及最低版本)
# 例如find_package(OpenCV 2.4.3 REQUIRED)

# 头文件
include_directories("路径")
# 例如
#include_directories(
# ${PROJECT_SOURCE_DIR}
# ${PROJECT_SOURCE_DIR}/include
# ${EIGEN3_INCLUDE_DIR}
)

# 设置路径(下面生成共享库的路径)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/lib)
# 即生成的共享库在工程文件夹下的lib文件夹中

# 创建共享库(把工程内的cpp文件都创建成共享库文件,方便通过头文件来调用)
add_library(${PROJECT_NAME} SHARED
src/cpp文件名
……
)
# 这时候只需要cpp,不需要有主函数
# ${PROJECT_NAME}是生成的库名 表示生成的共享库文件就叫做 lib工程名.so
# 也可以专门写cmakelists来编译一个没有主函数的程序来生成共享库,供其它程序使用

# 链接库
# 把刚刚生成的${PROJECT_NAME}库和所需的其它库链接起来
target_link_libraries(${PROJECT_NAME}
/usr/lib/i386-linux-gnu/libboost_system.so
)

# 编译主函数,生成可执行文件

# 先设置路径
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)

# 可执行文件生成
add_executable(要生成的可执行文件名 从工程目录下写起的主函数文件名)

# 这个可执行文件所需的库(一般就是刚刚生成的工程的库咯)
target_link_libraries(可执行文件名 ${PROJECT_NAME})

模板二(来自: Cmake知识----编写CMakeLists.txt文件编译C/C++程序)

#1.cmake verson,指定cmake版本 
cmake_minimum_required(VERSION 3.2)

#2.project name,指定项目的名称,一般和项目的文件夹名称对应
PROJECT(test_sqrt)

#3.head file path,头文件目录
INCLUDE_DIRECTORIES(
include
)

#4.source directory,源文件目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol"
SET(TEST_MATH
${DIR_SRCS}
)

#6.add executable file,添加要编译的可执行文件
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})

#7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

语法符号

  • SET(name, value) 设置变量
  • 添加头文件路径
INCLUDE_DIRECTORIE(I1
                   I2
                   ...) 
  • LINK_DIRECTORIES 添加库文件路径
  • LINK_LIBRARIES 添加库文件
  • AUX_SOURCE_DERECTORY(dir,SRCS) 设置源代码路径
    -SET(CMAKE_C_COMPILER /usr/local/Cellar/gcc/8.2.0/bin/gcc-8)
    -SET(CMAKE_CXX_COMPILER /usr/local/Cellar/gcc/8.2.0/bin/g++-8)

尚不明确

  • ADD_DEFINITIONS(-std=c++11)
  • ADD_DEFINITIONS(-02)
  • SET(CMAKE_CXX_FLAGS "-Wall ...")
  • SET(EXECUTABLE_OUT

https://www.cnblogs.com/lidabo/p/6068448.html
https://blog.csdn.net/stpeace/article/details/53054006
https://blog.csdn.net/bytxl/article/details/50634868
https://www.cnblogs.com/lidabo/p/7359422.html

参考

CMakeList 编写规则 -1
https://blog.csdn.net/wzzfeitian/article/details/40963457/
https://blog.csdn.net/u012654882/article/details/80209805

原文地址:https://www.cnblogs.com/wangzhiyi/p/9427058.html