一些简要的说明
面向新手,一步步教你完成一个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.引入外部库的基本步骤
懒得写了,大伙自己百度吧