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 \
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})
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!