引言
本文主要介绍如何在Qt6 + CMake 项目中直接引用第三方库编译发布文件(头文件、.lib/.a 导入库、.dll/.so 动态库),而不通过源码编译的方式。
假设第三方库 mylib 的文件结构如下:
C:/dev/mylib/├── include/│ └── mylib.h ├── lib/│ ├── mylib.lib(Windows 导入库)│ └── mylib.a(Linux 静态/导入库)└── bin/(可选)└── mylib.dll(Windows 运行时)CMakeLists.txt 配置示例:
#1.定义库的根路径(方便管理)set(MYLIB_ROOT"C:/dev/mylib")#2.添加头文件搜索路径target_include_directories(MyApp PRIVATE ${MYLIB_ROOT}/include)#3.添加库文件搜索路径target_link_directories(MyApp PRIVATE ${MYLIB_ROOT}/lib)#4.链接库文件(不需要写全路径,只需要库名)target_link_libraries(MyApp PRIVATE mylib # 在 Windows 上会找 mylib.lib,Linux 上会找 libmylib.a)重要细节:
1、导入库 vs 动态库
在 Windows 上,编译动态库会生成两个文件:
mylib.dll —— 运行时需要(动态库)
mylib.lib —— 编译链接时使用(导入库)
target_link_libraries() 链接的是 .lib 导入库,而不是 .dll。
在 Linux 上,动态库是 libmylib.so,链接时直接使用 .so 文件。
2、运行时确保能找到 .dll / .so
- Windows:把 .dll 文件复制到你的可执行文件(.exe)所在的输出目录。
- Linux:设置环境变量 LD_LIBRARY_PATH 包含 .so 所在目录,或者也复制到可执行文件同目录。
完整示例:
假设你在 Windows 上,第三方库放在 D:/libs/mylib,源码如下:
CMakeLists.txt:
cmake_minimum_required(VERSION3.16)project(MyApp)find_package(Qt6 REQUIRED COMPONENTS Core Widgets)set(MYLIB_ROOT"D:/libs/mylib")qt_add_executable(MyApp main.cpp mainwindow.cpp)# 添加头文件路径target_include_directories(MyApp PRIVATE ${MYLIB_ROOT}/include)# 添加库路径target_link_directories(MyApp PRIVATE ${MYLIB_ROOT}/lib)# 链接库target_link_libraries(MyApp PRIVATE Qt6::Core Qt6::Widgets mylib)# 自动复制 DLL 到输出目录(仅 Windows)if(WIN32)add_custom_command(TARGET MyApp POST_BUILD COMMAND ${CMAKE_COMMAND}-E copy_if_different ${MYLIB_ROOT}/bin/mylib.dll $<TARGET_FILE_DIR:MyApp>)endif()总结:
| 步骤 | 关键命令 |
|---|---|
| 指定头文件路径 | target_include_directories(… PRIVATE 路径) |
| 指定库文件路径 | target_link_directories(… PRIVATE 路径) |
| 链接库 | target_link_libraries(… 库名) |
| 运行时找 DLL | 复制到 .exe 同目录 或 设置环境变量 |
这种方式不依赖源码,完全基于已编译好的库文件,适用于你想固定使用某个特定版本库的场景。