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

it2025-03-02  25

文章目录

一些简要的说明正文1.在VS中构建Cmake项目2.编写简单的CMakeLists3.引入外部库的基本步骤

一些简要的说明

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

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

正文

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.引入外部库的基本步骤

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

最新回复(0)