目录
一、编写 CMake的最底层逻辑
- c++语言的头文件只是减少重复,在编译阶段会把内容加到#include文件内。
1、CMake安装
- 需要添加到系统变量:https://blog.csdn.net/u011231598/article/details/80338941
- 安装vscode插件
2、CMake使用
注意两点:犹如加工一道菜,需要找到原材料(文件)和原材料在哪(文件位置)
1、 工程目录如下:有两个lesson,每个lesson都有CMakeLists文件管理
2、CMakeLists文件内容
- 一般而言,头文件不需要引入
CMAKE_STUDY下的CMakeLists.txt
cmake_minimum_required(VERSION 3.1.5) #最低版本限制
project(cmake_study)
add_subdirectory(lesson1_1) //添加子文件夹,子文件夹内有对应各种的CMakeLists.txt,如果想编译lesson1_1则可以加这个
add_subdirectory(lesson1_2) //添加子文件夹,子文件夹内有对应各种的CMakeLists.txt,如果想编译lesson1_2则可以加这个
lesson1_1下的CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0) #最低版本限制
# 项目名称
project(test2 VERSION 0.1.0 LANGUAGES C CXX)
# 需要引入的文件夹名(菜名),cpp文件(材料名)
add_executable(lesson1_1 main.cpp) //此处的材料名可以引上一级文件夹也可以引下一文件夹
# 如果需要引用其他文件,可以通过下代码,引入该文件内所有文件。(lesson1-1有CMakeLists)
include_directories(../lesson1_1) //把想要加的路径加进来,在include头文件部分就不需要加此路径
lesson1_2下的CMakeLists.txt
cmake_minimum_required(VERSION 3.1.0) #最低版本限制
# 项目名称
project(test2 VERSION 0.1.0 LANGUAGES C CXX)
# 生成可执行文件,需要引入的文件名(菜名),cpp文件(材料名)
add_executable(lesson1_2 main.cpp ../lesson1_2/add.cpp) //此处的材料名可以引上一级文件夹也可以引下一文件夹
- CMakeLists.txt文件用于配置CMake的设置。配置文件也需要跟CMakeLists同一文件夹
通过vscode对应位置就可以执行:这部分没有,可以用ctrl+shift+p,输入cmake,点击配置
build是编译;第二个是运行
二、静态库和动态库;使用OpenCV
Windows一般动态库生成bin文件夹(内置dll文件),静态库生成lib文件夹(内置lib文件)。
- CMAKE_STUDY文件是包含 三个文件夹和一个CMakeLists.txt。其中lesson2_1为静态库,lesson2_2为动态库。
- 静态库:在编译阶段,链接阶段,直接把库放到可执行文件里,生成的可执行文件可单独执行。
- 动态库:只有在运行时才会加载的库。须跟可执行文件放一起,可执行文件执行时,需要找到动态库。
1、制作静态库
- lesson2_1下的add文件夹下的CMakeLists.txt,然后build,就可以生成对应add的静态库,add_static名的lib静态库
//生成静态库,名字;源材料
add_library(add_static add.cpp)
- 在lesson2_1会生成一个lib,把这个lib复制到对应位置,则可直接用。
- 为了方便别人能知道,也可以这么写,方便看。
- 另一种方案也可以不写。
在lesson2_1下的CMakeLists.txt
add_subdiretory(add) //添加add库(编译的add文件夹)加进来
include_directories(./lib) //把想要加的路径加进来,在include头文件部分就不需要加此路径
add_executable(lesson2_1 main.cpp) //此处不可直接link lib文件,lib由静态库生成
//方案1(推荐)链接库文件
target_link_libraries(lesson2_1 C:\lcmake_study\lesson2_1\lib\add_static.lib)
//方案2(不推荐)
//link lib文件
link_libraries(C:\lcmake_study\lesson2_1\lib\add_static.lib) //注意此处需要放绝对路径
2、制作动态库
windows和vscode下,想把文件导成动态库时:
- lesson2_2下的add下的CMakeLists.txt
//生成静态库,名字;源材料(与静态库唯一区别就是加SHARED)
add_library(add_shared SHARED add.cpp)
- add下的cpp文件,需要导出的文件,要使用静态库需要加__declspec(dllexport)到cpp文件:
会给你生成dll和lib文件,__declspec(dllexport) int add(int a, int b),代表这个函数是需要导出的,然后会将导出和可链接的信息放到lib文件里面。所以在静态库编译时,需要lib,在使用时用dll。在CMakeLists链接也是链接同时生成的lib文件。
-
需要把编译的built文件里面编译出来的lib文件挪到bin文件夹下
-
lesson2_2下下的CMakeLists.txt,编译,就能成功
add_subdirectory(add)
include_directories(./bin)
add_executable(lesson2_2 main.cpp) //此