当前位置: 首页>后端>正文

CMake简明笔记

学习系列视频

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.dllopencv_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++代码处理流程

  1. 使用预处理器展开头文件、宏替换、去掉注释。
g++ -E x.cpp -o x.i
  1. 使用编译器生成汇编文件
g++ -S x.i -o x.s # 汇编文件
  1. 使用汇编器生成二进制文件
g++ -c x.s -o x.o
  1. 使用链接器对调用库链接
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。
最简单的方式:

  1. 生成Makefile: 新建build文件夹,进入后运行cmake ${src path}
  2. 生成可执行文件:cmake --build .

补充:Makefile的学习视频


https://www.xamrdz.com/backend/3k51933851.html

相关文章: