目录结构
D:
├─bin
|
├─build
│
├─buildX86
│
├─include
|
└─MyMath
CMakeLists代码
可执行文件的CMakeLists代码
cmake_minimum_required(VERSION 3.20)
# 项目工程名称如果不额外指定可执行程序或者生产库的名字那么项目工程名称将会作为可执行库或者生产库的名称
project(UseMyMath)
# 判断生成文件的位数用于控制最后生成文件的路径
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(ARCH "x64")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Release)
else()
set(ARCH "x86")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Release)
endif()
# MyMath是自己写的动态链接库,它被可执行文件链接,通过 add_subdirectory 添加子工程
add_subdirectory(MyMath)
# 生成可执行文件的依赖文件
add_executable(${CMAKE_PROJECT_NAME}
main.cpp
include/MyMath.h
)
# 设置头文件包含目录
target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include)
# 设置库文件搜索目录
target_link_directories(UseMyMath PRIVATE
$<$<CONFIG:Debug>:${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Debug>
$<$<CONFIG:Release>:${CMAKE_CURRENT_SOURCE_DIR}/bin/${ARCH}/Release>
)
# 设置要链接的库
target_link_libraries(UseMyMath PRIVATE
MyMath
)
子工程的CMakeLists代码
cmake_minimum_required(VERSION 3.20)
project(MyMath)
# 添加宏定义用于导出动态链接库符号和使用动态链接库
add_compile_definitions(MyMath_Dll)
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../bin/${ARCH}/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/../bin/${ARCH}/Release)
else()
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_CURRENT_SOURCE_DIR}/../bin/${ARCH}/Debug)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_CURRENT_SOURCE_DIR}/../bin/${ARCH}/Release)
endif()
add_library(MyMath SHARED
MyMath.cpp
MyMath.h
)
# 在MyMath被链接前将头文件拷贝到固定目录,用于之后的 MyMath目标编译
add_custom_command(TARGET MyMath
PRE_LINK
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/MyMath.h ${CMAKE_CURRENT_SOURCE_DIR}/../include
)