美文网首页
CMake简明笔记

CMake简明笔记

作者: AntiGravity | 来源:发表于2024-03-14 12:12 被阅读0次

    学习系列视频

    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的学习视频

    相关文章

      网友评论

          本文标题:CMake简明笔记

          本文链接:https://www.haomeiwen.com/subject/rzmszdtx.html