引用第三方库
Windows 环境
一般引用第三方库的时候,主要需要三个东西:
- 头文件(include):包含库的函数声明,类定义等等
- 库文件(lib):包含编译好的二进制代码
- 运行时库(dll):动态链接库,静态链接库则不需要
为了得到这三个东西,一般的流程是:
获取项目源码
这个一般直接从 github 直接拉下来就行,或者浏览器直接下载等等也行
1 2
| git clone https://github.com/grpc/grpc
|
CMake 配置和生成
注意:cmake的配置和生成阶段不涉及编译。目的是生成构建系统所需要的文件(如 .sln和 Makefile文件)
1 2
| 1. configure: 解析 CMakeLists.txt 中的配置选项,设置项目变量和缓存,检查依赖关系 2. generate: 生成构建系统所需要的文件(如 .sln 和 .vcxproj 项目文件)
|
所以 CMake不是编译器,它只是一个跨平台的构建工具
编译第三方库
这一步在 windows通常用 msvc来完成,将源代码编译成二进制文件(如果是可执行项目,可以直接生成 .exe,第三方库就是 .lib 和 .dll 文件 。换句话说 .lib 文件 / .dll 文件 / .exe 文件都是二进制文件)
- 选择配置(Debug/Release)
- 编译源代码,生成 .obj 文件
- 链接 .obj 文件 -> 生成最终的 .lib 或者 .dll 文件(可执行项目就是 .exe 文件)
Ps. 点击生成之前需要进行一个配置,很重要,很多项目不兼容就是因为这个原因。项目中的所有库必须使用相同的运行时库类型(runtime-link)!
这一步就是在配置运行时库的一个类型(属性 -> C/C++ -> 代码生成 -> 运行库)
1 2 3 4
| 1. MT(Release): 静态链接多线程运行时库 2. MD(Release): 动态链接多线程运行时库 3. MTd(Debug): 静态链接多线程调试运行时库 4. MDd(Debug): 动态链接多线程调试运行时库
|
上面这么多类型其实不用记,只需要记住如果有一个项目选择的是 shared方式,其余所有的项目都需要选择 MD。
配置第三方库
在上一步库的编译以后,会得到第三方库的目录
- include: 头文件目录
- lib:库文件目录(grpc.dll, grpc.lib)
或者可执行文件目录 bin,然后接下来就是比较重要的配置第三方库:
- 包含目录(属性 -> VC++ 目录 -> 包含目录)输入第三方库
include 文件夹的路径
- 库目录(属性->VC++目录->库目录)输入第三方库
lib 文件夹的路径
- 运行时库(属性->链接器->输入->附加依赖项)输入
lib 文件夹下具体 lib/dll 文件的全称(有些库比如boost库不需要)
Linux 环境
1. vscode + clangd + conan配置开源项目
a. 项目中一般有 conanfile.txt,所以第一步就直接安装
1
| conan install . --build=missing -s build_type=Release
|
b. 为了让 clangd 正常工作,这里要首先 CMake 生成 compile_commands.json(作者一般写好了,直接构建就行)
1 2 3 4 5 6
| cmake \ -DCMAKE_TOOLCHAIN_FILE=build/Release/generators/conan_toolchain.cmake \ -DCMAKE_BUILD_TYPE=Release \ -S . \ -B build \ -G Ninja
|
c. 创建软链接,让 clangd自动发现
1
| ln -sf build/compile_commands.json ./
|
a. 写 conanfile.txt,因为这里一般是复现,可以直接把作者的该文件抄过来
1 2 3 4 5 6 7 8 9 10 11 12 13
| [requires] fmt/11.1.3 spdlog/1.15.1 cpp-httplib/0.20.1 nlohmann_json/3.12.0 gflags/2.2.2
[generators] CMakeDeps CMakeToolchain
[layout] cmake_layout
|
b. 重新检测缓存环境,于项目根目录下生成第三方库的配置环境
1
| conan install . --build=missing -s build_type=Release
|
c.写 CMakeLists来构建 compile_commands.json文件,注意一定要导出编译数据库,查找依赖和链接库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| cmake_minimum_required(VERSION 3.20) project(Demo LANGUAGES CXX)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(fmt CONFIG REQUIRED) find_package(spdlog CONFIG REQUIRED) find_package(httplib CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED) find_package(gflags CONFIG REQUIRED)
add_executable(demo main.cpp)
target_link_libraries(demo PRIVATE fmt::fmt spdlog::spdlog httplib::httplib nlohmann_json::nlohmann_json gflags::gflags )
|
d. 执行 CMake 并将生成的 compile_commands.json软链接到项目根目录下:
1 2 3 4 5 6
| cmake \ -DCMAKE_TOOLCHAIN_FILE=build/Release/generators/conan_toolchain.cmake \ -DCMAKE_BUILD_TYPE=Release \ -S . \ -B build \ -G Ninja
|
1
| ln -sf build/compile_commands.json ./
|
2. vs2022 + ssh 配置开源项目(前提是项目是存在本地的)
a. 通过 ssh 连接到远程系统
1 2 3 4
| 1. 主机名一般填 127.0.0.1 (wsl),其它看情况 2. 端口名一般就是 22 3. 用户名最好填 root,免得出现权限问题 4. 密码就是 sudo passwd root 的密码
|
b. 指定运行的计算机
1 2
| 1. 项目属性 -> 常规 -> 远程生成计算机 2. 同时下面可以指定远程生成代码的根目录
|
c. 指定调试的绝对路径
1 2 3
| 1. 项目属性 -> 调试 -> 程序(写入绝对路径) ps. 这里的绝对路径是指的远端程序的绝对路径,就是刚刚指定生成远程代码根目录下面,比如: /root/projects/LinuxConsole/bin/x64/Debug/LinuxConsole.out
|