我正在为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模块的相同场景的任何示例程序
答案 0 :(得分:1)
函数TARGET_LINK_LIBRARIES()
中条目的顺序很重要。最后要提到没有依赖性的库,它们通常是一些标准库或外部库,在此示例中是Qt5库。
一个例子:
Lib_A
取决于Lib_B
和Lib_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
)