分类 默认分类 下的文章

CMake+Vcpkg

前面连接的都还是单一库文件或者头文件,而当前流行的是第三方库包的形式(package)。用Vcpkg管理第三方库包,再在CMakeLists.txt中调用find_package(),这就可以从被指定的路径中找到包的.cmake脚本,从而完成大型第三方库的导入。

vcpkg

在使用这种组合时,不需要用vcpkg new --application来创建,但是也可以这样做。主要利用的是vcpkg的包文件,所以要添加CMAKE_TOOLCHAIN_FILE=C:/src/vcpkg/scripts/buildsystems/vcpkg.cmake,链接到vcpkg工具库。

在vscode中,可以在“运行并显示命令”中使用cmake:select a kit选择要使用的编译工具,在cmake:open cmake tools extension settings的configure args中添加配置时要传递给cmake的参数,相当于-D...标记。

find_package()

find_package(Eigen3 REQUIRED)
#之后可以使用${Eigen3_DIR}、${Eigen3_INCLUDE_DIR}

是查找库这一步最主要的函数。它从vcpkg的文件夹中查找库的.cmake文件。

C:\src\vcpkg\installed\x64-windows

这个路径是集中了include、shared等用于链接的重要文件的路径。

CMAKE_PREFIX_PATH

这个路径指定了寻找各种文件的路径,这里主要取它作为<...>Config.cmake父目录的性质。

设置该路径为上一步的路径,则find_<...>()系列函数都可以从该路径出找到目标文件。

cmake_minimum_required (VERSION 3.10)
project (Transformation)

set(CMAKE_PREFIX_PATH "C:/src/vcpkg/installed/x64-windows")

find_package(Eigen3 REQUIRED)

message(${EIGEN3_INCLUDE_DIR})
message(${CMAKE_PREFIX_PATH})
message(${Eigen3_DIR})


add_executable (Transformation main.cpp)

target_link_libraries(Transformation Eigen3::Eigen)

使用包

可以直接使用target_link_libraries()将包的名字空间连接到其他目标文件。

由于可能环境会莫名奇妙的修改你的CMAKE_PREFIX_PATH,请在CMakeLists.txt中显式定义它。

参考文献

[1]CMAKE_PREFIX_PATH — CMake 3.31.0-rc3 Documentation

[2][CmakeList][转载]Could not find a package configuration file provided by “Opencv“-CSDN博客

链接动态库

  • 动态库源文件编写

  • add_libraries(库名 SHARED 源文件)

  • add_executable(可执行文件名 源文件)

  • 链接库到可执行文件,target_link_libraries(可执行文件名 库名)

脚本语言有顺序需求,如果在link前没有两个目标文件被创建,cmake的编译将出错。(即cmake .出错。)

.
├── CMakeLists.txt
├── build
│   ├── CMakeCache.txt
│   ├── CMakeFiles
│   ├── Makefile
│   ├── cmake_install.cmake
│   ├── compile_commands.json
│   ├── hello.exe
│   ├── libmymath.dll
│   └── libmymath.dll.a
├── main.cpp
├── mymath.cpp
└── mymath.hpp

附件:

cmake+dll+ANSI转义.zip

参考文献: [1]【技能分享】为C语言控制台终端启用彩色支持(无需第三方软件) [2]Step 2: Adding a Library — CMake 3.31.0-rc2 Documentation