Cmake Qt5 |未定义对`QPrinter :: QPrinter(QPrinter :: PrinterMode)的引用

时间:2018-08-23 21:36:32

标签: cmake qt5

我正在为qt应用程序准备cmake构建。我在使用以下结构..

libMyApp 使用

SET(QT5_MODULES Widgets PrintSupport Network XmlPatterns)
FIND_PACKAGE(Qt5 REQUIRED COMPONENTS ${QT5_MODULES})

TARGET_LINK_LIBRARIES(
    ${TARGET_NAME}
    Qt5::Widgets
    Qt5::PrintSupport 
    Qt5::Network
    Qt5::XmlPatterns
)

libMyApp构建成功并生成libMyApp.a(静态库)

现在我正在我的应用程序MyApp中使用此库 使用

SET(QT5_MODULES Widgets PrintSupport XmlPatterns)
FIND_PACKAGE(Qt5 REQUIRED COMPONENTS ${QT5_MODULES})

TARGET_LINK_LIBRARIES(
    ${TARGET_NAME}
    Qt5::Widgets
    Qt5::PrintSupport 
    Qt5::XmlPatterns
    ${CODE_LIB_FILES}
)

$ {CODE_LIB_FILES}是libMyApp.a的列表保存路径 MyApp成功构建,最后显示链接错误

undefined reference to `QPrinter::QPrinter(QPrinter::PrinterMode)

xml也发生了同样的事情

undefined reference to `QDomNode::isElement() const'

谁能指出这里出什么问题了?

或描述带有printsupport和xmlpatterns模块的相同场景的任何示例程序

1 个答案:

答案 0 :(得分:1)

函数TARGET_LINK_LIBRARIES()中条目的顺序很重要。最后要提到没有依赖性的库,它们通常是一些标准库或外部库,在此示例中是Qt5库。

一个例子:

  • 取决于应用程序
  • Lib_A取决于Lib_BLib_std
  • Lib_B取决于Lib_std
  • Lib_std没有依赖项

该函数的调用应为以下内容:

TARGET_LINK_LIBRARIES(
    ${TARGET_NAME}   # Name of the app
    "Lib_A"
    "Lib_B"
    "Lib_std"        # Last entries: Std Libs, external Libs, ...
)

在此应用程序中,我假设${CODE_LIB_FILES}=libMyApp.a与Qt5-Lib有一些依赖关系,因此将此项移至Qt5-Lib上方是合理的。

SET(QT5_MODULES Widgets PrintSupport XmlPatterns)
FIND_PACKAGE(Qt5 REQUIRED COMPONENTS ${QT5_MODULES})

TARGET_LINK_LIBRARIES(
    ${TARGET_NAME}
    ${CODE_LIB_FILES}       # <<< Moved this entry up
    Qt5::Widgets
    Qt5::PrintSupport 
    Qt5::XmlPatterns
)