预备
目录结构
root:.
│ CMakeLists.txt
│ main.cpp
│
├─include
│ head.h
│
└─subdir
add.cpp
CMakeLists.txt
Code
main.cpp
#include <iostream>
#include "head.h"
int main() {
LOG();
int x = 1;
int y = 2;
printf("%d + %d = %d\n", x, y, add(x, y));
}
head.h
辅助验证cmake的配置
#ifndef HEAD
#define HEAD
#include <iostream>
#define LOG() \
printf("File[%s]\nTime[%s] cpp[%d] Fun[%s]\n", __FILE__, __TIME__, \
__cplusplus, __func__);
extern int add(int, int);
#endif
add.cpp
#include <iostream>
#include "head.h"
int add(int x, int y) {
LOG();
return x + y;
}
CMakeLists.txt
在cmake中,动静态库的制作主要配置同一个位置的参数即可。
root
说明:
- 注意
add_executable
要写在库操作的上面 add_subdirectory
会自动检测子目录中的CMakeLists.txt
target_link_libraries
- 如果是当前工程中生成的,则可以写简称
- 如果是外部的,则写全称
cmake_minimum_required(VERSION 3.15)
project(mydemo)
set(CMAKE_CXX_STANDARD 17)
set(MY_APP_NAME app)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/bin)
add_executable(
${MY_APP_NAME}
main.cpp
)
# 指定头文件搜索目录
target_include_directories(${MY_APP_NAME}
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
# 添加子目录
# - 在这个子目录中用来生成库
add_subdirectory(subdir)
# 链接生成的库
# - 当前项目生成的简写
# - 外部库写全称
target_link_libraries(${MY_APP_NAME}
PUBLIC
add
# ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/libadd.dll
)
subdir
说明:
- 注意:这cmake是整个project的一个子cmake
- 每个
CMakeLists.txt
都可以做自己的配置,如设定与root的cmake不同的版本号 - 动静态库的参数
- 静态库 STATIC
- 动态库 SHARED
set(CMAKE_CXX_STANDARD 20)
set(MY_LIB_NAME add)
# 库名 动/静 原文件
add_library(${MY_LIB_NAME}
# STATIC
SHARED
add.cpp
)
# 给目标设定头文件
target_include_directories(${MY_LIB_NAME}
PUBLIC
${PROJECT_SOURCE_DIR}/include
)
END
相关链接
(CMake) 指定生成器 generator_cmake generator-CSDN博客
(CMake) 库的生成和链接_cmake生成静态库链接静态库-CSDN博客
效果
mkdir build
cd build
cmake ..
cmake --build .
cd ../bin
app.exe
File[E:\cpp-demo\compilation\CMake\make-lib\main.cpp]
Time[23:46:02] cpp[201703] Fun[main]
File[E:\cpp-demo\compilation\CMake\make-lib\subdir\add.cpp]
Time[23:46:01] cpp[202002] Fun[add]
1 + 2 = 3
root:.
│ CMakeLists.txt
│ main.cpp
│
├─bin
│ app.exe
│ libadd.dll
│
├─build
\.......
│
├─include
│ head.h
│
├─lib
│ libadd.dll.a
│
└─subdir
add.cpp
CMakeLists.txt