cmake 的link_libraries和target_link_libraries

文档中说 link_libraries已经被废弃了

Deprecated. Use the target_link_libraries() command instead.

也就是这个两个函数的作用应该差不多
一个区别是:
target_link_libraries 要在 add_executable 之后
link_libraries 要在 add_executable 之前

附,三个有效的cmakelist.txt的例子

  • target_link_libraries 版
cmake_minimum_required(VERSION 3.12)

include_directories("/usr/local/Cellar/vips/8.6.0/include")
include_directories("/usr/local/Cellar/glib/2.54.2/lib/glib-2.0/include")
include_directories("/usr/local/Cellar/glib/2.54.2/include/glib-2.0")


link_directories("/usr/local/Cellar/glib/2.54.2/lib")
link_directories("/usr/local/opt/gettext/lib")
link_directories("/usr/local/Cellar/vips/8.6.0/lib")

add_executable(vipc main.c)

target_link_libraries(vipc vips)
target_link_libraries(vipc glib-2.0)
target_link_libraries(vipc gobject-2.0)
  • link_libraries版
cmake_minimum_required(VERSION 3.12)

include_directories("/usr/local/Cellar/vips/8.6.0/include")
include_directories("/usr/local/Cellar/glib/2.54.2/lib/glib-2.0/include")
include_directories("/usr/local/Cellar/glib/2.54.2/include/glib-2.0")


link_directories("/usr/local/Cellar/glib/2.54.2/lib")
link_directories("/usr/local/opt/gettext/lib")
link_directories("/usr/local/Cellar/vips/8.6.0/lib")

link_libraries(vips)
link_libraries(glib-2.0)
link_libraries(gobject-2.0)

add_executable(vipc main.c)
  • pkg-config 版
# 查看编译参数
pkg-config vips --cflags --libs
# 使用
gcc main.c `pkg-config vips --cflags --libs`

参考:
http://www.it1352.com/516453.html
https://cmake.org/cmake/help/latest/module/FindPNG.html

find_package(pkgconfig)
pkg_search_module(VIPS required vips)

# 不知道为啥这个dir 一定要单独指定才行,按理说应该是不用的,但是如果注释掉这句,链接时会报找不到 lintl
link_directories("/usr/local/opt/gettext/lib") 

add_definitions(${VIPS_DEFINITIONS})

add_executable(vipc main.c)

target_link_libraries(vipc ${VIPS_LIBRARIES})
target_include_directories(vipc PUBLIC ${VIPS_INCLUDE_DIRS})

参考:
https://www.cnblogs.com/binbinjx/p/5626916.html
https://stackoverflow.com/questions/39598323/how-to-properly-link-libraries-with-cmake

<think>我们正在处理用户关于Qt6 PrintSupport模块在CMaketarget_link_libraries阶段报错的问题。根据引用内容,我们可以总结出以下几点关键信息:1.在CMake中,链接库时应优先使用通过find_package导入的目标(如Qt6::PrintSupport),而不是硬编码路径(引用[1])。2.使用全局属性管理依赖可以避免硬编码,提高可维护性(引用[2])。3.链接库的顺序很重要,错误的顺序可能导致未定义引用错误(引用[3])。4. target_link_libraries的顺序会影响编译顺序(引用[4])。结合用户之前的问题(配置Qt6PrintSupport模块)当前报错,我们推测报错可能由以下原因引起:1.未正确链接PrintSupport模块:即target_link_libraries中没有包含Qt6::PrintSupport。2.链接顺序问题:Qt6::PrintSupport可能需要在其他库之前或之后链接。3.未正确使用find_package导入Qt6模块。因此,解决方案如下:步骤1:确保CMakeLists.txt中正确导入Qt6的PrintSupport模块```cmakecmake_minimum_required(VERSION3.16...3.25)project(MyProject)#查找Qt6,必须包含PrintSupport模块find_package(Qt6REQUIREDCOMPONENTS CoreGuiWidgetsPrintSupport) #添加可执行文件add_executable(MyAppmain.cpp) #正确链接目标库,注意使用导入的目标target_link_libraries(MyApp PRIVATEQt6::CoreQt6::GuiQt6::WidgetsQt6::PrintSupport) ```步骤2:检查链接顺序根据引用[3][4],链接顺序很重要。确保Qt6的库按照正确的顺序链接。通常,先链接具体的模块(如Qt6::Core、Qt6::Gui),然后是Qt6::WidgetsQt6::PrintSupport。如果有其他第三方库,注意将系统库(如pthread)放在后面。步骤3:避免硬编码路径不要使用绝对路径链接库,而是使用find_package导入的目标(如Qt6::PrintSupport)。步骤4:处理全局依赖(可选)如果项目很大,有多个目标需要链接相同的库,可以考虑使用全局属性来统一管理(引用[2])。例如:```cmake#设置全局属性,添加公共依赖set_property(GLOBALPROPERTYGLOBAL_LIBS Qt6::Core Qt6::Gui Qt6::WidgetsQt6::PrintSupport)#然后在每个目标中获取该属性并链接get_property(common_libs GLOBAL PROPERTY GLOBAL_LIBS) target_link_libraries(MyAppPRIVATE${common_libs}) ```常见错误分析:1.未定义引用(undefinedreference):-可能缺少某个库,确保链接了所有必要的Qt模块(如PrintSupport)。-链接顺序错误,调整顺序(例如,将Qt6::PrintSupport放在其他依赖它的库之前)。2.找不到Qt6PrintSupport:-确保已经正确安装Qt6并配置了CMake的模块查找路径(设置CMAKE_PREFIX_PATH为Qt6的安装路径)。3.其他系统库缺失(如打印相关的系统库):-在Linux上,可能需要链接cups库(Qt打印后端使用)。在CMakeLists.txt中添加:```cmakefind_package(Cups)if(CUPS_FOUND)target_link_libraries(MyApp PRIVATE ${CUPS_LIBRARIES})endif()```示例:完整配置(考虑跨平台)```cmakecmake_minimum_required(VERSION3.16) project(MyPrintApp) set(CMAKE_CXX_STANDARD17) set(CMAKE_AUTOMOC ON)#使用Qt的moc需要#设置Qt安装路径(如果CMake找不到,可以手动设置) #set(CMAKE_PREFIX_PATH "/path/to/Qt/6.x.x/gcc_64")find_package(Qt6 COMPONENTSCore Gui Widgets PrintSupport REQUIRED)#检查CUPS(Linux打印系统)if(UNIXAND NOTAPPLE)find_package(Cups)endif() add_executable(MyPrintAppmain.cppmainwindow.cppmainwindow.h)target_link_libraries(MyPrintAppPRIVATEQt6::CoreQt6::GuiQt6::WidgetsQt6::PrintSupport)if(UNIXAND NOTAPPLEAND CUPS_FOUND)target_link_libraries(MyPrintApp PRIVATE ${CUPS_LIBRARIES})endif() ```注意:在WindowsmacOS上,Qt通常会自动处理打印后端,不需要额外链接系统库。在Linux上,通常需要CUPS(CommonUNIXPrinting System)。如果问题仍未解决,请检查:-是否在代码中正确包含了头文件(如#include<QtPrintSupport/QPrinter>)?-是否使用了正确的命名空间(如果有)?-编译器是否支持C++17(Qt6要求)?通过以上步骤,应该可以解决target_link_libraries阶段的报错问题。§§相关问题§§1.如何配置CMake以支持Qt6的其他模块(如Network,Sql)?2.在Linux上使用Qt6打印时,如何解决CUPS库缺失的问题?3.如何为Qt6项目设置跨平台编译选项? 4.如何解决Qt6模块在CMake中找不到的问题? 5.在大型CMake项目中如何有效管理Qt6模块的依赖?</think>### Qt6 PrintSupport target_link_libraries 报错解决方案 根据引用内容常见问题,报错通常由以下原因引起,请按步骤排查: #### 1. 确保正确链接 PrintSupport 模块(核心问题) 在 `CMakeLists.txt` 中必须包含: ```cmake find_package(Qt6 REQUIRED COMPONENTS PrintSupport) # 关键步骤 target_link_libraries(your_target PRIVATE Qt6::PrintSupport) ``` **常见错误**: - ❌ 遗漏 `find_package` 中的 `PrintSupport` - ❌ 使用硬编码路径而非目标名称(如 `libQt6PrintSupport.so`)[^1] --- #### 2. 检查链接顺序(引用[3][4]) Qt 模块链接需遵循**依赖顺序**: ```cmake target_link_libraries(your_target PRIVATE Qt6::Core # 基础模块在前 Qt6::Gui Qt6::Widgets Qt6::PrintSupport # 打印模块在后 ${OTHER_LIBS} # 其他库最后 ) ``` **错误示例**: ```cmake target_link_libraries(app my_custom_lib # ❌ 自定义库应在Qt库之后 Qt6::PrintSupport ) ``` --- #### 3. 全局依赖管理(引用[2]) 大型项目推荐使用全局属性管理: ```cmake # 设置全局依赖 set_property(GLOBAL PROPERTY QT_LIBS Qt6::Core Qt6::Gui Qt6::Widgets Qt6::PrintSupport ) # 在目标中应用 get_property(QT_DEPS GLOBAL PROPERTY QT_LIBS) target_link_libraries(your_target PRIVATE ${QT_DEPS}) ``` --- #### 4. 完整 CMake 配置示例 ```cmake cmake_minimum_required(VERSION 3.16) project(MyPrintApp) find_package(Qt6 REQUIRED COMPONENTS Core Gui Widgets PrintSupport) add_executable(my_app main.cpp) target_link_libraries(my_app PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets Qt6::PrintSupport # 必须包含此项 ) ``` --- #### 5. 跨平台注意事项 - **Windows**:检查 Qt 安装路径是否在 `CMAKE_PREFIX_PATH` 中 - **Linux/macOS**:确保开发包已安装(如 `libqt6printsupport-dev`) - **通用方案**:在 CMake 中显式设置路径: ```cmake set(CMAKE_PREFIX_PATH "/opt/Qt/6.5.0/gcc_64") ``` > ⚠️ 若仍报 `undefined reference`,检查是否遗漏 `Q_INIT_RESOURCE` 或 moc 未生成(启用 `set(CMAKE_AUTOMOC ON)`)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值