双笙仔佯谬_小彭老师_CMake课程笔记

发布时间 2023-06-07 13:59:43作者: 马角的逆袭

CMake

  • 可以通过-D选项设置编译器和cpp版本

    1. cmake -Bbuild -DCMAKE_CXX_COMPILER=/usr/bin/gcc-6 可以指定使用gcc-6编译
    2. cmake -Bbuild -DCMAKE_CXX_STANDARD=14 用c++14版本
  • 使用add_libaray生成动态链接库或静态链接库

    1. add_libaray(mylib STATIC add.cpp)add_libaray(mylib SHARED add.cpp)
  • add_subdirtory添加子模块

    1. 复杂的项目一般都是有很多个子模块的
    2. 主CMakeLists.txt可以add_subdirtory(myadd)
  • 子模块的头文件如何处理 47分29秒
    3. 自动引用子模块的头文件:可以子模块的CMakeLists.txt里添加target_include_directories(mylib PUBLIC . ) 使用了PUBLIC于是引用了mylib的人就可以使用头文件了

    展开查看:49分05秒截图-带target和不带target的区别 drawing
  • 添加一个宏定义

    1. 在cmake里写target_add_difinitions(mylib PUBLIC MY_MACRO=1)就相当于在代码里添加了#define MY_MACRO 1,
  • 添加一个编译选项

    1. target_compile_options(myapp PUBLIC -fopenmp)就相当于在编译时添加了-fopenmp参数g++ -fopenmp -o myapp xxx

第三方库

  1. 第三方库分为3种,纯头文件库[1],可以作为子模块的库[2],必须预安装的库[3]
    • 纯头文件库,只需要将头文件下载下来,然后用include_directorys(spdlog/include)即可,缺点是编译慢

      展开查看:小彭老师cmake第58分50秒截图一些常用的head_only的库 drawing
    • 作为子模块的库,先把库下载下来,放到目录里,让后使用add_subdirectory(fmt)target_link_libaraies(main PUBLIC fmt),就可以了
      好处是比head_only的引入方式编译快

      展开查看:小彭老师cmake第1时08分截图用子模块的方式引入fmt库 drawing
    • 系统预安装的库,首先我们引入库可能会出现菱形依赖问题,比如spdlog自带了fmt库,如果我们想要引入fmt和spdlog就会有菱形依赖问题,
      使用系统预安装的方式就可以避免菱形依赖问题,因为系统预安装的方式会查找缓存,缓存里有fmt::fmt了就不会再引入了
      具体使用方法就是find_package()target_link_libaraies

      展开查看:小彭老师cmake第1时14分截图用系统预按装的方式 drawing drawing

  1. 他简单介绍了glm这个好用的数学库,像opencv一样有vec和mat
  2. 标准库里有个std::valarry的东西,可以把array里的东西全部作一遍操作,比如valarry arr(1.0,2.0,3.0),当使用arr2 = std::sin(arr * pi)时,arr2就是(3.14,6.18,9.42)

可以configure,install等