VS构建多模块的Cmake项目+引入外部dll

  • Post author:
  • Post category:其他




一些简要的说明

面向新手,一步步教你完成一个Cmake项目(for C艹)的构建,包括:

  1. 在VS中建立Cmake项目
  2. 编写简单的MakeLists
  3. 引入外部库的基本步骤



正文



1.在VS中构建Cmake项目

在这里插入图片描述

在这里插入图片描述

建立项目后,我们来看一下整个目录结构:

子项目文件夹:CMakeproject3

–Cmakeproject3下的源文件和 子目录的CMakeLists.txt

输出文件夹:out (这个删了也没事,可以重新生成)

根目录的CMakeLists

我们通过编写CMakeLists来编译源文件,根目录和每个子目录都需要编写相应的CMakeLists

编译生成的输出被放入输出文件夹out(一目了然)



2.编写简单的CMakeLists

我们以手上一个写好的CMakeLists进行说明:

# CMakeList.txt: CMakeProject1 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#

cmake_minimum_required (VERSION 3.8)
set(CMAKE_CXX_STANDARD 14)
project ("CMakeProject1")



# 设置编译目录
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)

#生成时拷贝dll到Bin中
file(GLOB dll_src "${CMAKE_SOURCE_DIR}/ThirdPart/Dll/Debug/*.dll" )
file(COPY ${dll_src} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

include_directories(
	${CMAKE_SOURCE_DIR}/ThirdPart/include/uplangraphic
	${CMAKE_SOURCE_DIR}/ThirdPart/include/uplancommon
)

# 设置链接目录
link_directories(
	${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
	${CMAKE_SOURCE_DIR}/ThirdPart/Lib
)


add_subdirectory("ChannelMatrix")



顶层CMakeLists一般用来设置整个项目的全局设置

我们逐行来看

cmake_minimum_required (VERSION 3.8)   
set(CMAKE_CXX_STANDARD 14)

这两行分别设置了CMAKE最低要求的版本和C++标准库版本


project ("CMakeProject1")

指定了顶层project的名字#(。—。)随便起


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)

前两行分别设置库文件的输出目录,我们这个项目没有,就不细讲了

如果对静态库 动态库 不了解的,可以参考

lib与dll的关系(详解静态链接库和动态链接库)

(写的很好就是了)

第三行输出运行过程产生的文件(exe文件或执行过程中产生的一些文件会被输出到这里)


file(GLOB dll_src "${CMAKE_SOURCE_DIR}/ThirdPart/Dll/Debug/*.dll" )
file(COPY ${dll_src} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

众所周知(雾),运行程序在用到外部dll库时,需要把dll放入到程序可以访问到的位置,如C:\windows\system32 或者 exe所在的目录中,搜索顺序: 1.包含EXE文件的目录,2.进程的当前工作目录, 3.Windows系统目录, 4.Windows目录,5.列在Path环境变量中的一系列目录。

你也可以把dll路径加入到环境变量中。如果手动拷贝过去的话,不够优雅就是了,所以还是用命令拷贝到之前定义的CMAKE_RUNTIME_OUTPUT_DIRECTORY里吧(也就是exe所在的目录)


include_directories(
	${CMAKE_SOURCE_DIR}/ThirdPart/include/grapic
	${CMAKE_SOURCE_DIR}/ThirdPart/include/common
)

这两行设置三方库头文件的搜索目录


link_directories(
${CMAKE_SOURCE_DIR}/ThirdPart/Lib
)

这里设置三方库lib文件的搜索目录,如果你的三方库有lib文件的话

(不懂的参考——

话说刚才为什么不看?


add_subdirectory("ChannelMatrix")

添加子项目


下面我们打开子项目的CMakeLists,简单介绍一下

# CMakeList.txt: PMCorrectionPlugins 的 CMake 项目,在此处包括源代码并定义
# 项目特定的逻辑。
#

# 项目名
project ("ChannelMatrix")

# 设置c++语言标准,使用c++14
set(CMAKE_CXX_STANDARD 14)

cmake_minimum_required (VERSION 3.4)

# 源文件
file(GLOB matrix_src "src/*.cpp" )


# 为windows添加宏
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
	add_definitions(-DPMCORRPLUGINS_EXPORTS)
endif()

# 设置头文件搜索目录
include_directories(
	incl
)

# 生成可执行文件
add_executable(matrix ${matrix_src})

# 添加链接库
target_link_libraries(matrix 	uplangraphic)


重复的就不说了,,, 对了 这是我子目录的目录结构:

在这里插入图片描述

incl放头文件,src放cpp文件

file(GLOB matrix_src "src/*.cpp" )

用这个把.cpp文件全部放到matrix_src这个变量里(很好用就是了)


# 为windows添加宏
if (CMAKE_SYSTEM_NAME MATCHES "Windows")
	add_definitions(-DPMCORRPLUGINS_EXPORTS)
endif()

设置宏编译


# 设置头文件搜索目录
include_directories(
	incl
)

在incl里找这个子项目的头文件


# 生成可执行文件
add_executable(matrix ${matrix_src})

为你的子项目,生成一个可执行文件(前提是你得写个int main()当入口函数)


# 添加链接库
target_link_libraries(matrix  graphic)

链接到dll库(提问:为什么这个库的名字叫graphic呢? 我们之前可都没定义这个变量啊

~当然是因为lib的名字叫 Graphic.lib ,去掉.lib就是库的名字了(不区分大小写)



3.引入外部库的基本步骤

懒得写了,大伙自己百度吧



版权声明:本文为qq_42501554原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。