学习系列视频
C++项目简介
- .cpp文件:源码
- .h文件:头文件,减少代码重复
CMakeLists.txt
通常项目根目录下一个,并在每个子目录都有一个。
根目录的如下:
cmake_minimum_required(VERSION 3.15) # optional
project(cmake_study) # name of project
add_subdirectory(lesson1_1) # includes other CMakeLists.txt in subdirectory
子目录的如下:
add_executable(lesson1_1 main.cpp add.cpp) # name & source files
include_directories(../lesson1_1) # include .h file from another directory
静态库与动态库
动态库:.dll文件,运行时才加载,必须被执行文件找到。通常放在执行文件(如.exe)同目录。
静态库:.lib文件,链接时压入执行文件,可独立运行。
静态库
add_library(add_static add.cpp) # build .lib file
include_directories(./lib) # add.h
target_link_libraries(lesson2_1 ${abs path of lib file})
add_executable(lesson2_1 main.cpp)
动态库
如是用windows且用visual studio编译器,则需要在源码的函数前加入declspec的声明
__declspec(dllexport) int add(int a, int b)
而在使用其的头文件中可以加入导入声明(只有在导出一个类且有静态变量时才必须加入,否则不加也可以)
__declspec(dllimport) int add(int a, int b)
CMakeLists.txt如下:
add_library(add_shared SHARED add.cpp) # build .dll
include_directories(./bin)
add_executable(lesson2_2 main.cpp)
# in WIN sys, building requires .lib, NOT DLL! .dll only required when running
target_link_libraries(lesson2_2 ${abs path of LIB file})
标准写法
为简化declspec的声明,标准写法会加入export.h
,内容如下:
#pragma once
#ifdef EXPORT
#define CMAKE_STUDY_API __declspec(dllexport)
#else
#define CMAKE_STUDY_API __declspec(dllimport)
#endif
意思时,如果定义了EXPORT
变量,就定义CMAKE_STUDY_API
为__declspec(dllexport)
,反之亦然。
而在之前的文件中就可以改写为
#define EXPORT
#include "export.h"
CMAKE_STUDY_API int add(int a, int b)
定义EXPORT也可以在CMakeLists.txt中这样写:
add_library(add_shared SHARED add.cpp)
# 仅在编译add_shared时,自动加入宏定义的EXPORT
target_compile_definitions(add_shared PRIVATE EXPORT)
实战:调用opencv库
安装后,先找头文件:
进入opencv/build/include/opencv2
,找到opencv.hpp
。
再找库:
进入opencv/build/x64/vc16/bin
,找到opencv_world480.dll
和opencv_world480d.dll
。
即可以写项目。
CMakeLists.txt如下:
include_directories(${abs path of /include})
add_executable(lessons2_opencv main.cpp)
target_link_libraries(lesson2_opencv ${abs path of lib)
生成执行文件后将dll移动到同目录即可运行。
CMake跨平台应用
Linux中g++代码处理流程
- 使用预处理器展开头文件、宏替换、去掉注释。
g++ -E x.cpp -o x.i
- 使用编译器生成汇编文件
g++ -S x.i -o x.s # 汇编文件
- 使用汇编器生成二进制文件
g++ -c x.s -o x.o
- 使用链接器对调用库链接
g++ x.o y.o -o z
以上任何一步都可以跳过。例如可以直接生成
g++ x.cpp y.cpp -o z
Makefile
使用makefile可以便捷的运行以上命令,例如:
main: x.cpp y.cpp # target: dependencies
g++ x.cpp y.cpp -o z
CMake统一了win和linux两大平台
集合了Linux的Makefile和Windows的.sln和.exe。
最简单的方式:
- 生成Makefile: 新建build文件夹,进入后运行
cmake ${src path}
- 生成可执行文件:
cmake --build .
补充:Makefile的学习视频