在CMake Qt项目中链接和UIC顺序 [英] Linking and UIC order in a CMake Qt project

查看:424
本文介绍了在CMake Qt项目中链接和UIC顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谈论一个使用cmake的buildt的Qt 5.3.2项目。
这是UIC执行和target_link_libraries之间的调用顺序问题...不幸的是不是顺序。



会找到



1。)a CMakeLists.txt和



2的一个(仍然有效)摘录部分。 )命令cmake的输出的摘录。



3。)不使用
生成的对'make'的下一个调用的输出

如果(在我的库的源代码 libqt.a ),我需要'ui_main.h'
使进程崩溃,找不到头。查看
非崩溃make输出显示了原因:

  [..] 
扫描依赖关系目标qt
[29%]构建CXX对象CMakeFiles / qt.dir / home / kochmn / projects / sentinel / src / qt / form_main.cpp.o
[35%]构建CXX对象CMakeFiles / qt .dir / qt_automoc.cpp.o
链接CXX静态库libqt.a
[..]
[52%]生成ui_main.h
[..]

Make会在之前生成 libqt.a 头文件。
所以我尝试使用像

  target_link_libraries(sentinel 
$ {Qt5Widgets_LIBRARIES} $ {Qt5Gui_LIBRARIES} $ {Qt5Core_LIBRARIES})

add_library(优化$ {DIR_SRC} /optimization/linalg.cpp)
add_library(qt$ {DIR_SRC} /qt/form_main.cpp)

target_link_libraries(sentinel qt optimization)

无效。问题:如何激励cmake 运行UIC生成ui头文件,然后编译我的 libqt.a

>

附录



 #2.8.11而不是自动连结qtmain.lib 
#库如果这应该扩展到Windows。
#(http://doc.qt.io/qt-5/cmake-manual.html)
cmake_minimum_required(VERSION 2.8.11)

project(sentinel)

set(CMAKE_AUTOMOC ON)
#CMake使用uic为了从设计器的.ui表单生成头文件。
set(CMAKE AUTOUIC ON)
#自动生成函数将其头文件写入构建目录。
#因此应该包括构建目录。
set(CMAKE_INCLUDE_CURRENT_DIR ON)

#>获得Qt要点。 ----------------------------------------
#小部件找到它自己的依赖项(QtGui和QtCore)。
find_package(Qt5Widgets REQUIRED)

消息(Found Qt5Widgets Version $ {Qt5Widgets_VERSION_STRING})

#所有这些亲爱的变量解释如下:
#http://doc.qt.io/qt-5/cmake-manual.html
消息(Core FOUND:$ {Qt5Core_FOUND})
消息(Gui FOUND:$ {Qt5Gui_FOUND} )
消息(Widgets FOUND:$ {Qt5Widgets_FOUND})
消息(Core VERSION:$ {Qt5Core_VERSION_STRING})
消息(Gui VERSION:$ {Qt5Gui_VERSION_STRING}
消息(窗口小部件版本:$ {Qt5Widgets_VERSION_STRING})
消息(核心包含:$ {Qt5Core_INCLUDE_DIRS})
消息(桂包含:$ {Qt5Gui_INCLUDE_DIRS})
消息(小工具包含:$ {Qt5Widgets_INCLUDE_DIRS})
消息(核心库:$ {Qt5Core_LIBRARIES})
消息(GUI库:$ {Qt5Gui_LIBRARIES})
消息(Widgets LIBRARIES:$ {Qt5Widgets_LIBRARIES})
消息(核心定义:$ {Qt5Core_DEFINITIONS})
消息(Gui定义:$ {Qt5Gui_DEFINITIONS})
消息窗口小部件定义:$ {Qt5Widgets_DEFINITIONS})
消息(核心COMPILE_DEFINITIONS:$ {Qt5Core_COMPILE_DEFINITIONS})
消息(桂COMPILE_DEFINITIONS:$ {Qt5Gui_COMPILE_DEFINITIONS})
消息(窗口小部件COMPILE_DEFINITIONS:$ {Qt5Widgets_COMPILE_DEFINITIONS})
消息(核心EXECUTABLE_COMPILE_FLAGS:$ {Qt5Core_EXECUTABLE_COMPILE_FLAGS})
消息(桂EXECUTABLE_COMPILE_FLAGS:$ {Qt5Gui_EXECUTABLE_COMPILE_FLAGS})
消息(窗口小部件EXECUTABLE_COMPILE_FLAGS: $ {Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})

include_directories(
$ {Qt5Widgets_INCLUDE_DIRS} $ {Qt5Core_INCLUDE_DIRS} $ {Qt5Gui_INCLUDE_DIRS})

add_definitions($ {Qt5Widgets_DEFINITIONS})
#add_definitions($ {Qt5Core_DEFINITIONS})#不必要。在小部件。
#add_definitions($ {Qt5Gui_DEFINITIONS})#不必要。在小部件。
#< -------------------------------------------------- -----------------

set(DEBUG 1)
set(SENTINEL_NAMESentinel GL)
set(SENTINEL_VERSION_MAJOR 0)
set(SENTINEL_VERSION_MINOR1)
set(SENTINEL_VERSION$ {SENTINEL_VERSION_MAJOR}。$ {SENTINEL_VERSION_MINOR})

##编译器标志
(CMAKE_CXX_FLAGS$ {CMAKE_CXX_FLAGS} $ {Qt5Widgets_EXECUTABLE_COMPILE_FLAGS})
#$ {Qt5Core_EXECUTABLE_COMPILE_FLAGS} $ {Qt5Gui_EXECUTABLE_COMPILE_FLAGS}#< - 冗余。

if(CMAKE_COMPILER_IS_GNUCXX)
消息(使用GnuCXX编译器)
add_definitions( - O0 -std = c ++ 0x -lSOIL -llapacke -lblas)
endif()

if(DEBUG MATCHES 1)
消息(\\\
Building DEBUG build。)
add_definitions(-Wall)
set CMAKE_BUILD_TYPE Debug)
endif()

set(DIR_BASE$ {PROJECT_SOURCE_DIR} / ..)
set(DIR_SRC$ {PROJECT_SOURCE_DIR} /../ src)
set(DIR_RES$ {PROJECT_SOURCE_DIR} /../ resources)
set(DIR_BUILD$ {PROJECT_SOURCE_DIR} /../ build)

#使用uic生成FormMain.ui> ui_FormMain.h
set(qt_H
$ {DIR_BUILD} /ui_main.h$ {DIR_BUILD} /ui_dialog_setup_game.h)
#使用可信赖的QtDesigner生成。
set(qt_UI
$ {DIR_SRC} /ui/main.ui$ {DIR_SRC} /ui/dialog_setup_game.ui)
#我自己手写的XML描述内部资源。
set(qt_QRC$ {DIR_RES} /application.qrc)

#生成moc生成的源文件的规则
QT5_WRAP_CPP(qt_H_MOC $ {qt_H})
#生成从ui文件构建头文件的规则
QT5_WRAP_UI(qt_UI_H $ {qt_UI})
#资源处理。 QRC:Qt Resource Collection
QT5_ADD_RESOURCES(qt_RCCS $ {qt_QRC})
#btw .: rcc从./resources/application.qrc生成一个C程序
#需要。 cmake看到了。 :-)
#< -------------------------------------------------- -----------------

include_directories($ {DIR_SRC} / include$ {PROJECT_SOURCE_DIR})

add_executable(sentinel$ {DIR_SRC} /sentinel.cpp$ {qt_H_MOC} $ {qt_UI_H} $ {qt_RCCS})

#这里列出了可用的模块:http://doc.qt.io /qt-5/qtmodules.html
#find / usr / lib / x86_64-linux-gnu / cmake -iname* .cmake *| less
#注意:http://stackoverflow.com/questions/20266235/cmake-error-qglwidget-no-such-file-or-directory
qt5_use_modules(sentinel Widgets Gui Core)

add_library(优化$ {DIR_SRC} /optimization/linalg.cpp)
add_library(qt$ {DIR_SRC} /qt/form_main.cpp)

target_link_libraries sentinel
$ {Qt5Widgets_LIBRARIES} $ {Qt5Gui_LIBRARIES} $ {Qt5Core_LIBRARIES}
qt优化


kochmn @ Ulyss:〜/ projects / sentinel / build $ cmake。
- C编译器标识为GNU 4.9.2
- CXX编译器标识为GNU 4.9.2
- 检查工作C编译器:/ usr / bin / cc
- 检查工作C编译器:/ usr / bin / cc - works
- 检测C编译器ABI信息
- 检测C编译器ABI信息 - 完成
- 检查用于工作CXX编译器:/ usr / bin / c ++
- 检查工作的CXX编译器:/ usr / bin / c ++ - 工作
- 检测CXX编译器ABI信息
- 检测CXX编译器ABI信息 - 完成
找到Qt5Widgets版本5.3.2
核心发现:1
Gui FOUND:1
Widgets FOUND:1
核心版本:5.3.2
Gui VERSION:5.3.2
Widgets VERSION:5.3.2
核心包含:/ usr / include / x86_64-linux-gnu / qt5 /; / usr / include / x86_64-linux- gnu / qt5 / QtCore; / usr / lib / x86_64-linux-gnu / qt5 // mkspecs / linux-g ++ - 64
Gui INCLUDE:/ usr / include / x86_64-linux-gnu / qt5 /; / usr / include / x86_64-linux-gnu / qt5 / QtGui; / usr / include / x86_64-linux-gnu / qt5 / QtCore; / usr / lib / x86_64-linux-gnu / qt5 // mkspecs / linux-g ++ - 64
Widgets INCLUDE:/ usr / include / x86_64-linux-gnu / qt5 /; / usr / include / x86_64-linux-gnu / qt5 / QtWidgets; / usr / include / x86_64-linux-gnu / qt5 / QtGui; / usr / include / x86_64-linux-gnu / qt5 / QtCore; / usr / lib / x86_64-linux-gnu / qt5 // mkspecs / linux-g ++ - 64
核心LIBRARIES:Qt5 :: Core
GUI库:QT5 ::桂
小工具库:QT5 ::小工具
核心定义:-DQT_CORE_LIB
桂定义:-DQT_GUI_LIB; -DQT_CORE_LIB
小工具定义:-DQT_WIDGETS_LIB; -DQT_GUI_LIB; -DQT_CORE_LIB
核心COMPILE_DEFINITIONS:QT_CORE_LIB
桂COMPILE_DEFINITIONS:QT_GUI_LIB; QT_CORE_LIB
小工具COMPILE_DEFINITIONS:QT_WIDGETS_LIB; QT_GUI_LIB; QT_CORE_LIB
核心EXECUTABLE_COMPILE_FLAGS:-fPIE
桂EXECUTABLE_COMPILE_FLAGS :-fPIE
Widgets EXECUTABLE_COMPILE_FLAGS:-fPIE
使用GnuCXX编译器。

构建DEBUG构建。

Sentinel GL - C ++项目V 0.1。

(c)Markus-Hermann Koch,mhk@markuskoch.eu,2015/04 / 28-?

主目录是/ home / kochmn / projects / sentinel / build
系统是Linux
生成配置头:/ home / kochmn / projects / sentinel / build / /build/mhk_cmake_config.h
- 配置完成
- 生成完成
- 构建文件已写入:/ home / kochmn / projects / sentinel / build

kochmn @ Ulyss:〜/ projects / sentinel / build $ make
扫描目标的依赖关系optimization_automoc
[5%]目标优化的自动moc
[5%]建立目标optimization_automoc
扫描目标优化的依赖关系
[11%]构建CXX对象CMakeFiles / optimization.dir / home / kochmn / projects / sentinel / src / optimization / linalg.cpp.o
[17% ]构建CXX对象CMakeFiles / optimization.dir / optimization_automoc.cpp.o
链接CXX静态库liboptimization.a
[17%]构建目标优化
扫描目标qt_automoc的依赖关系
[23%]自动moc目标qt
[23%]内置目标qt_automoc
扫描目标的依赖关系qt
[29%]构建CXX对象CMakeFiles / qt.dir / home / kochmn / projects / sentinel / src / qt / form_main.cpp.o
[35%]构建CXX对象CMakeFiles / qt.dir / qt_automoc.cpp.o
链接CXX静态库libqt.a
[35%]建立目标qt
扫描目标的依赖关系sentinel_automoc
[41%]目标sentinel的自动moc
[41%]建立目标sentinel_automoc
[47%]生成qrc_application .cpp
[52%]生成ui_main.h
[58%]生成moc_ui_main.cpp
/home/kochmn/projects/sentinel/build/ui_main.h:0:注意:找到相关类。未生成输出。
[64%]生成ui_dialog_setup_game.h
[70%]生成moc_ui_dialog_setup_game.cpp
/home/kochmn/projects/sentinel/build/ui_dialog_setup_game.h:0:注意:没有相关的类发现。未生成输出。
扫描目标sentinel的依赖关系
[76%]构建CXX对象CMakeFiles / sentinel.dir / home / kochmn / projects / sentinel / src / sentinel.cpp.o
[82%] CXX对象CMakeFiles / sentinel.dir / moc_ui_main.cpp.o
[88%]构建CXX对象CMakeFiles / sentinel.dir / moc_ui_dialog_setup_game.cpp.o
[94%]构建CXX对象CMakeFiles / sentinel。 dir / qrc_application.cpp.o
[100%]构建CXX对象CMakeFiles / sentinel.dir / sentinel_automoc.cpp.o
链接CXX可执行文件sentinel
[100%]建立目标sentinel $ b CMake生成顺序是根据文件和目标之间的依赖关系计算的。 如果您的 qt 库依赖于.ui文件生成的头文件,那么您必须在目标的输入中添加 $ {qt_UI_H} c> qt

  QT5_WRAP_UI(qt_UI_H $ {qt_UI})
。]
add_library(qt$ {DIR_SRC} /qt/form_main.cpp$ {qt_UI_H})

并且CMake应该在编译之前通常在.ui文件上执行UIC。 libqt



target_link_libraries 只能设置目标之间的依赖关系(在链接时)。在编译时,正常的行为是找到所有源文件。在你的情况下,生成一些头,所以设置这些头作为目标的输入,确保生成它们的宏(QT5_WRAP_UI)将在目标编译之前执行。


Talking about a Qt 5.3.2 project which is buildt using cmake. This is a calling order problem between UIC execution and target_link_libraries... unfortunately not in that order.

Below this text you will find

1.) a (still functional) excerpt section of my CMakeLists.txt and

2.) an excerpt of the the output of the command 'cmake .'

3.) the output of a following call to 'make' without using the generated headers like 'ui_main.h'.

If (in the source of my library libqt.a) I require 'ui_main.h' the make process crashes not finding the header. Looking at the non-crashing make output shows why:

[..]
Scanning dependencies of target qt
[ 29%] Building CXX object CMakeFiles/qt.dir/home/kochmn/projects/sentinel/src/qt/form_main.cpp.o
[ 35%] Building CXX object CMakeFiles/qt.dir/qt_automoc.cpp.o
Linking CXX static library libqt.a
[..]
[ 52%] Generating ui_main.h
[..]

Make would generate libqt.a before generating the required header file. So I experimented using code like

target_link_libraries(sentinel
  ${Qt5Widgets_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Core_LIBRARIES})

add_library(optimization "${DIR_SRC}/optimization/linalg.cpp")
add_library(qt "${DIR_SRC}/qt/form_main.cpp")

target_link_libraries(sentinel qt optimization)

to no avail. The question: How can I motivate cmake to first run UIC generating the ui-header files and then compiling my libqt.a?

Appendix

# 2.8.11 instead of 2.8 required for automatic linking to the qtmain.lib
# library if this ever should expand to Windows.
# (http://doc.qt.io/qt-5/cmake-manual.html)
cmake_minimum_required(VERSION 2.8.11)

project(sentinel)

set( CMAKE_AUTOMOC ON )
# CMake uses uic in order to generate header files from .ui forms from designer.
set ( CMAKE AUTOUIC ON )
# Auto-generating functions write their headers into the build directory.
# Hence the build directory should be included.
set( CMAKE_INCLUDE_CURRENT_DIR ON )

#> Getting the Qt essentials. ----------------------------------------
# Widgets finds its own dependencies (QtGui and QtCore).
find_package(Qt5Widgets REQUIRED)

message ("Found Qt5Widgets Version ${Qt5Widgets_VERSION_STRING}")

# All those darling variables are explained here:
# http://doc.qt.io/qt-5/cmake-manual.html
message("Core    FOUND: ${Qt5Core_FOUND}")
message("Gui     FOUND: ${Qt5Gui_FOUND}")
message("Widgets FOUND: ${Qt5Widgets_FOUND}")
message("Core    VERSION: ${Qt5Core_VERSION_STRING}")
message("Gui     VERSION: ${Qt5Gui_VERSION_STRING}")
message("Widgets VERSION: ${Qt5Widgets_VERSION_STRING}")
message("Core    INCLUDE: ${Qt5Core_INCLUDE_DIRS}")
message("Gui     INCLUDE: ${Qt5Gui_INCLUDE_DIRS}")
message("Widgets INCLUDE: ${Qt5Widgets_INCLUDE_DIRS}")
message("Core    LIBRARIES: ${Qt5Core_LIBRARIES}")
message("Gui     LIBRARIES: ${Qt5Gui_LIBRARIES}")
message("Widgets LIBRARIES: ${Qt5Widgets_LIBRARIES}")
message("Core    DEFINITIONS: ${Qt5Core_DEFINITIONS}")
message("Gui     DEFINITIONS: ${Qt5Gui_DEFINITIONS}")
message("Widgets DEFINITIONS: ${Qt5Widgets_DEFINITIONS}")
message("Core    COMPILE_DEFINITIONS: ${Qt5Core_COMPILE_DEFINITIONS}")
message("Gui     COMPILE_DEFINITIONS: ${Qt5Gui_COMPILE_DEFINITIONS}")
message("Widgets COMPILE_DEFINITIONS: ${Qt5Widgets_COMPILE_DEFINITIONS}")
message("Core    EXECUTABLE_COMPILE_FLAGS: ${Qt5Core_EXECUTABLE_COMPILE_FLAGS}")
message("Gui     EXECUTABLE_COMPILE_FLAGS: ${Qt5Gui_EXECUTABLE_COMPILE_FLAGS}")
message("Widgets EXECUTABLE_COMPILE_FLAGS: ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")

include_directories(
  ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5Gui_INCLUDE_DIRS})

add_definitions(${Qt5Widgets_DEFINITIONS})
#add_definitions(${Qt5Core_DEFINITIONS}) # Unnecessary. In Widgets.
#add_definitions(${Qt5Gui_DEFINITIONS})  # Unnecessary. In Widgets.
#< -------------------------------------------------------------------

set (DEBUG 1)
set (SENTINEL_NAME "Sentinel GL")
set (SENTINEL_VERSION_MAJOR "0")
set (SENTINEL_VERSION_MINOR "1")
set (SENTINEL_VERSION "${SENTINEL_VERSION_MAJOR}.${SENTINEL_VERSION_MINOR}")

## Compiler flags
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
#  ${Qt5Core_EXECUTABLE_COMPILE_FLAGS} ${Qt5Gui_EXECUTABLE_COMPILE_FLAGS} #<-- redundant.

if(CMAKE_COMPILER_IS_GNUCXX)
  message("Using GnuCXX compiler.")
  add_definitions("-O0 -std=c++0x -lSOIL -llapacke -lblas")
endif()

if (DEBUG MATCHES 1)
  message("\nBuilding DEBUG build.")
  add_definitions(-Wall)
  set(CMAKE_BUILD_TYPE Debug)
endif()

set(DIR_BASE "${PROJECT_SOURCE_DIR}/..")
set(DIR_SRC "${PROJECT_SOURCE_DIR}/../src")
set(DIR_RES "${PROJECT_SOURCE_DIR}/../resources")
set(DIR_BUILD "${PROJECT_SOURCE_DIR}/../build")

# Generated using uic FormMain.ui > ui_FormMain.h
set(qt_H
  "${DIR_BUILD}/ui_main.h" "${DIR_BUILD}/ui_dialog_setup_game.h")
# Generated using the trusty QtDesigner.
set(qt_UI
  "${DIR_SRC}/ui/main.ui" "${DIR_SRC}/ui/dialog_setup_game.ui")
# My own hand-written XML describing the internal resources.
set(qt_QRC "${DIR_RES}/application.qrc")

# generate rules for building source files that moc generates
QT5_WRAP_CPP(qt_H_MOC ${qt_H})
# generate rules for building header files from the ui files
QT5_WRAP_UI(qt_UI_H ${qt_UI})
# Resource Handling. QRC: "Qt Resource Collection"
QT5_ADD_RESOURCES(qt_RCCS ${qt_QRC})
# btw.: rcc generates a C program from ./resources/application.qrc
# However, this is not needed. cmake sees to that. :-)
#< -------------------------------------------------------------------

include_directories("${DIR_SRC}/include" "${PROJECT_SOURCE_DIR}")

add_executable(sentinel "${DIR_SRC}/sentinel.cpp" ${qt_H_MOC} ${qt_UI_H} ${qt_RCCS})

# Available modules are listed here: http://doc.qt.io/qt-5/qtmodules.html
#   find /usr/lib/x86_64-linux-gnu/cmake -iname "*.cmake*" | less
# Note: http://stackoverflow.com/questions/20266235/cmake-error-qglwidget-no-such-file-or-directory
qt5_use_modules(sentinel Widgets Gui Core)

add_library(optimization "${DIR_SRC}/optimization/linalg.cpp")
add_library(qt "${DIR_SRC}/qt/form_main.cpp")

target_link_libraries(sentinel
  ${Qt5Widgets_LIBRARIES} ${Qt5Gui_LIBRARIES} ${Qt5Core_LIBRARIES}
  qt optimization
)

kochmn@Ulyss:~/projects/sentinel/build$ cmake .
-- The C compiler identification is GNU 4.9.2
-- The CXX compiler identification is GNU 4.9.2
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
Found Qt5Widgets Version 5.3.2
Core    FOUND: 1
Gui     FOUND: 1
Widgets FOUND: 1
Core    VERSION: 5.3.2
Gui     VERSION: 5.3.2
Widgets VERSION: 5.3.2
Core    INCLUDE: /usr/include/x86_64-linux-gnu/qt5/;/usr/include/x86_64-linux-gnu/qt5/QtCore;/usr/lib/x86_64-linux-gnu/qt5//mkspecs/linux-g++-64
Gui     INCLUDE: /usr/include/x86_64-linux-gnu/qt5/;/usr/include/x86_64-linux-gnu/qt5/QtGui;/usr/include/x86_64-linux-gnu/qt5/QtCore;/usr/lib/x86_64-linux-gnu/qt5//mkspecs/linux-g++-64
Widgets INCLUDE: /usr/include/x86_64-linux-gnu/qt5/;/usr/include/x86_64-linux-gnu/qt5/QtWidgets;/usr/include/x86_64-linux-gnu/qt5/QtGui;/usr/include/x86_64-linux-gnu/qt5/QtCore;/usr/lib/x86_64-linux-gnu/qt5//mkspecs/linux-g++-64
Core    LIBRARIES: Qt5::Core
Gui     LIBRARIES: Qt5::Gui
Widgets LIBRARIES: Qt5::Widgets
Core    DEFINITIONS: -DQT_CORE_LIB
Gui     DEFINITIONS: -DQT_GUI_LIB;-DQT_CORE_LIB
Widgets DEFINITIONS: -DQT_WIDGETS_LIB;-DQT_GUI_LIB;-DQT_CORE_LIB
Core    COMPILE_DEFINITIONS: QT_CORE_LIB
Gui     COMPILE_DEFINITIONS: QT_GUI_LIB;QT_CORE_LIB
Widgets COMPILE_DEFINITIONS: QT_WIDGETS_LIB;QT_GUI_LIB;QT_CORE_LIB
Core    EXECUTABLE_COMPILE_FLAGS: -fPIE
Gui     EXECUTABLE_COMPILE_FLAGS: -fPIE
Widgets EXECUTABLE_COMPILE_FLAGS: -fPIE
Using GnuCXX compiler.

Building DEBUG build.

Sentinel GL -- C++ Project V 0.1.

(c) Markus-Hermann Koch, mhk@markuskoch.eu, 2015/04/28-?

Primary directory is /home/kochmn/projects/sentinel/build
System is Linux
Generating configuration header: "/home/kochmn/projects/sentinel/build/../build/mhk_cmake_config.h"
-- Configuring done
-- Generating done
-- Build files have been written to: /home/kochmn/projects/sentinel/build

kochmn@Ulyss:~/projects/sentinel/build$ make 
Scanning dependencies of target optimization_automoc
[  5%] Automatic moc for target optimization
[  5%] Built target optimization_automoc
Scanning dependencies of target optimization
[ 11%] Building CXX object CMakeFiles/optimization.dir/home/kochmn/projects/sentinel/src/optimization/linalg.cpp.o
[ 17%] Building CXX object CMakeFiles/optimization.dir/optimization_automoc.cpp.o
Linking CXX static library liboptimization.a
[ 17%] Built target optimization
Scanning dependencies of target qt_automoc
[ 23%] Automatic moc for target qt
[ 23%] Built target qt_automoc
Scanning dependencies of target qt
[ 29%] Building CXX object CMakeFiles/qt.dir/home/kochmn/projects/sentinel/src/qt/form_main.cpp.o
[ 35%] Building CXX object CMakeFiles/qt.dir/qt_automoc.cpp.o
Linking CXX static library libqt.a
[ 35%] Built target qt
Scanning dependencies of target sentinel_automoc
[ 41%] Automatic moc for target sentinel
[ 41%] Built target sentinel_automoc
[ 47%] Generating qrc_application.cpp
[ 52%] Generating ui_main.h
[ 58%] Generating moc_ui_main.cpp
/home/kochmn/projects/sentinel/build/ui_main.h:0: Note: No relevant classes found. No output generated.
[ 64%] Generating ui_dialog_setup_game.h
[ 70%] Generating moc_ui_dialog_setup_game.cpp
/home/kochmn/projects/sentinel/build/ui_dialog_setup_game.h:0: Note: No relevant classes found. No output generated.
Scanning dependencies of target sentinel
[ 76%] Building CXX object CMakeFiles/sentinel.dir/home/kochmn/projects/sentinel/src/sentinel.cpp.o
[ 82%] Building CXX object CMakeFiles/sentinel.dir/moc_ui_main.cpp.o
[ 88%] Building CXX object CMakeFiles/sentinel.dir/moc_ui_dialog_setup_game.cpp.o
[ 94%] Building CXX object CMakeFiles/sentinel.dir/qrc_application.cpp.o
[100%] Building CXX object CMakeFiles/sentinel.dir/sentinel_automoc.cpp.o
Linking CXX executable sentinel
[100%] Built target sentinel

解决方案

CMake generation order is computed from dependencies between files and targets. If your qt library depends on headers generated from .ui files, then you have to add ${qt_UI_H} in inputs of target qt:

QT5_WRAP_UI(qt_UI_H ${qt_UI})
[...]
add_library(qt "${DIR_SRC}/qt/form_main.cpp" ${qt_UI_H})

And CMake should normally execute UIC on .ui files before compiling libqt

By the way using target_link_libraries only set dependencies between targets at link time. At compile time, the normal behavior is "All source files should be found". In your case, some headers are generated, so setting these headers as input of a target ensures that the macro which generates them (QT5_WRAP_UI) will be executed before the compilation of the target.

这篇关于在CMake Qt项目中链接和UIC顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆