版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1338348
目录结构如下:
├── CMakeLists.txt
├── demo_3.cpp
├── demo3_h.h
└── demo3_main.cpp
demo3_h.h内容如下:
namespace demo3{
void print_demo3();
}
demo_3.cpp代码如下:
#include "demo3_h.h"
#include <iostream>
namespace demo3{
void print_demo3(){
std::cout<<"this is demo3"<<std::endl;
}
}
整个工程结构如下:
CMakeLists.txt 如下,使用三种方式设置文件读取:
cmake_minimum_required(VERSION 3.5)
project(demo3)
# This project show multi files build in cmake.
# first way: set source file by name
#set(SRC_LIST demo3_main.cpp demo_3.cpp)
# second way: use this get all the files in the current directory
# aux_source_directory(. SRC_LIST)
# third way: file glob
file(GLOB SRC_LIST ./*.cpp)
add_executable(demo3 ${SRC_LIST})
目录结构如下:
├── CMakeLists.txt
├── demo4_inc
│ ├── demo_4.cpp
│ └── demo4_h.h
└── demo4_main.cpp
CMakeLists.txt 如下:
cmake_minimum_required(VERSION 3.5)
project(demo4)
# This project show multi files build in cmake.
include_directories(demo4_inc)
aux_source_directory(. SRC_LIST)
message("src list is ${SRC_LIST}")
# if not add src in demo4_inc, then you will get "undefined reference to `demo4::print_demo4()"
aux_source_directory(demo4_inc SRC_LIST)
message("after add demo4_inc directory src list is ${SRC_LIST}")
add_executable(demo4 ${SRC_LIST})
编译输出如下:
项目结构如下:
├── CMakeLists.txt
├── demo_5.cpp
└── demo5_h.h
CMakeLists.txt 如下(生成static lib):
cmake_minimum_required(VERSION 3.5)
project(demo5)
aux_source_directory(. SRC_LIST)
# create static lib
add_library(demo5 STATIC ${SRC_LIST})
# install lib and .h
install(TARGETS demo5 DESTINATION lib)
install(FILES demo5_h.h DESTINATION include)
如果要生成so lib:
# create dynamic lib
add_library(demo5_dynamic SHARED ${SRC_LIST})
ubuntu16下默认的安装在/usr/local下面:
root@xy:~/cmake_practice/cmake_build/build_demo5# make install
[100%] Built target demo5
Install the project...
-- Install configuration: ""
-- Installing: /usr/local/lib/libdemo5.a
-- Installing: /usr/local/include/demo5_h.h
cmake -DCMAKE_INSTALL_PREFIX=./ ../../cmake_tuorial/demo5/
输出如下:
build目录下面有install_manifest.txt文件,内容如下:
/usr/local/lib/libdemo5.a
/usr/local/include/demo5_h.h
如下命令删除安装(https://stackoverflow.com/questions/41471620/cmake-support-make-uninstall (cited from)):
xargs rm < install_manifest.txt
#
下个如下
# 指定lib输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
# 指定版本
set(DEMO5_VERSION_MAJOR 1)
set(DEMO5_VERSION_MINOR 1)
set(DEMO5_VERSION_PATCH 1)
set(DEMO5_VERSION ${DEMO5_VERSION_MAJOR}.${DEMO5_VERSION_MINOR}.${DEMO5_VERSION_PATCH})
aux_source_directory(. SRC_LIST)
add_library(demo5 SHARED ${SRC_LIST})
set_target_properties(demo5 PROPERTIES VERSION ${DEMO5_VERSION}
SOVERSION ${DEMO5_VERSION_MAJOR}
)
编译输出如下:
root@xy:~/cmake_practice/cmake_build/build_demo5# ll -th lib/
total 36K
-rwxr-xr-x 1 root root 8.6K May 20 09:51 libdemo5.so.1.1.1*
drwxr-xr-x 2 root root 4.0K May 20 09:51 ./
lrwxrwxrwx 1 root root 13 May 20 09:51 libdemo5.so -> libdemo5.so.1*
lrwxrwxrwx 1 root root 17 May 20 09:51 libdemo5.so.1 -> libdemo5.so.1.1.1*