1.hello world

main.cpp

int main(){
  std::cout << "Hello, World!" << std::endl;
  return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.14) #最低cmake版本
project(test) #定义项目名称
set(CMAKE_CXX_STANDARD 11) #设置c++编译标准版本
add_executable(test main.cpp)

构建

cmake . #.代表本目录
make

Note:

1.project(name)会同时隐式定义NAME_BINARY_DIR 以及NAME_SOURCE_DIR变量

2.SET(VAR [VALUE] [CACHE TYPE DOCSTRING [FORCE]]) 定义变量:set( SRC_LIST main.cpp test.cpp)

3.ADD_EXECUTABLE(test ${SRC_LIST}) 生成名为test的可执行文件 源文件为SRC_LIST

4.变量使用${}取值,在IF控制语句中直接使用变量名

指令(参数1 参数2 …) 指令不区分大小写 参数区分大小写

》〉》以上hello world 的编译为内部编译,无法删除中间文件

5.外部构建(通常的方式)

sudo mkdir build #在工程目录任意位置 
cd build
cmake .. #..代表父目录(包含CMakeLists.txt构建文件)
make

6.ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL]) 当前工程添加源文件存放的子目录并指定目标二进制文件存放目录:

ADD_SUBDIRECTORY(src bin)

7.cmake -DCMAKE_INSTALL_PREFIX=/usr/local . #-DCMAKE_INSTALL_PREFIX指定安装目录

8.INSTALL指令 DCMAKE_INSTALL_PREFIX默认为/usr/local目录

目标文件的安装

INSTALL(TARGETS targets…

​ [

​ [ARCHIVE|LIBRARY|RUNTIME]

​ [DESTINATION (dir)]

​ [PERMISSIONS permissions…]

​ [CONFIGURATIONS [Debug|Release|…]

​ ]

​ [COMPONENT \] [OPTIONAL] ] […])

INSTALL(TARGETS myrun mylib mystaticlib

​ RUNTIME DESTINATION bin

​ LIBRARY DESTINATION lib

​ ARCHIVE DESTINATION libstatic )

可执行文件 myrun 安装到${CMAKE_INSTALL_PREFIX}/bin 目录

动态库 libmylib 安装到${CMAKE_INSTALL_PREFIX}/lib 目录

静态库 libmystaticlib 安装到${CMAKE_INSTALL_PREFIX}/libstatic 目录

普通文件的安装

INSTALL(FILES files…

​ DESTINATION (dir)

​ [PERMISSIONS permissions…] [CONFIGURATIONS [Debug|Release|…]] [COMPONENT (component)] [RENAME (name)] [OPTIONAL])

2.静态库与动态库构建

ADD_LIBRARY(libname [SHARED|STATIC|MODULE] [EXCLUDE_FROM_ALL] source1 source2 … sourceN)

工程目录 CMakeLists.txt

PROJECT(HELLOLIB) 

ADD_SUBDIRECTORY(lib)

līb目录下 CMakeLists.txt

SET(LIBHELLO_SRC hello.c) 

ADD_LIBRARY(hello SHARED ${LIBHELLO_SRC}) #动态库

ADD_LIBRARY(hello_static STATIC ${LIBHELLO_SRC}) #静态库

SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello") #使得动态库和静态库同名

SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1) #防止同名时被清理

SET_TARGET_PROPERTIES(hello_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) #防止同名时被清理
INSTALL(TARGETS hello hello_static 
                LIBRARY DESTINATION lib 
                ARCHIVE DESTINATION lib)

构建并安装

sudo mkdir build 
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr .. 
make
make install

lib目录生成libhello.so libhello.a文件,并安装到/usr/bin目录

3.外部共享库和头文件的使用

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...) #添加包含目录指令

INCLUDE_DIRECTORIES(/usr/include/hello)

LINK_DIRECTORIES(directory1 directory2 ...) 添加共享库目录

TARGET_LINK_LIBRARIES(target library1 library2 ...) #为目标文件添加需要的共享库

TARGET_LINK_LIBRARIES(main libhello.so) #动态库

TARGET_LINK_LIBRARIES(main libhello.a) #静态库

4.cmake 常用指令

ADD_DEFINITIONS(-D…):向 C/C++编译器添加-D 定义

AUX_SOURCE_DIRECTORY(dir VARIABLE):发现一个目录下所有的源代码文件并将列表存储在一个变量中

AUX_SOURCE_DIRECTORY(. SRC_LIST)

ADD_EXECUTABLE(main ${SRC_LIST})



笔记      make

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!