在OSX上构建时,为什么Clang不会为此Qt项目生成TARGET目录?

时间:2015-10-20 18:15:00

标签: xcode macos qt c++11 clang

我有一个使用以下工具链的项目(full code here):

  • OSX 10.10.5(Yosemite)
  • C ++ 11(似乎仍然有比C ++ 14更好的编译器支持)
  • Qt 5.5.0(跨平台GUI库)
  • Qt Creator 3.5.0(与Qt紧密集成的IDE)
  • QMake(与Qt紧密集成的构建工具)
  • Clang 6.0 64位(在OSX上使用Qt Creator时的默认编译器)
  • Xcode 6.1.1(另一个用于OSX的IDE,Clang似乎与之捆绑在一起)

当我尝试构建项目时,会出现问题。值得注意的是,当我使用Windows 7而不是OSX和MingW / GCC而不是Xcode / Clang时,完全相同的代码和项目文件编译和链接没有任何错误或警告。还值得注意的是,当我上次在我的OSX机器上进行开发时,这个完全相同的工具集正在进行一些提交。如果我不得不猜测,我会说在我的项目文件中添加“CONFIG + = c ++ 11”行是触发问题的原因(现在无法删除它而不会导致其他问题)。以下是输出的示例:

09:06:44: Running steps for project AISweeper...
09:06:44: Starting: "/usr/bin/make" clean
rm -f qrc_sweeper_resources.cpp
rm -f moc_player_abstract.cpp moc_player_human.cpp moc_player_machine_learning_ai.cpp moc_player_probability_based_ai.cpp moc_player_random_action_ai.cpp moc_sweeper_batch_manager.cpp moc_sweeper_batch_settings.cpp moc_sweeper_batch_status.cpp moc_sweeper_control_window.cpp moc_sweeper_game.cpp moc_sweeper_widget.cpp
rm -f ui_sweeper_control_window.h
rm -f player_abstract.o player_human.o player_machine_learning_ai.o player_probability_based_ai.o player_random_action_ai.o sweeper_batch_manager.o sweeper_batch_settings.o sweeper_batch_status.o sweeper_common_functions.o sweeper_control_window.o sweeper_game.o sweeper_main.o sweeper_model.o sweeper_node.o sweeper_widget.o qrc_sweeper_resources.o moc_player_abstract.o moc_player_human.o moc_player_machine_learning_ai.o moc_player_probability_based_ai.o moc_player_random_action_ai.o moc_sweeper_batch_manager.o moc_sweeper_batch_settings.o moc_sweeper_batch_status.o moc_sweeper_control_window.o moc_sweeper_game.o moc_sweeper_widget.o
rm -f *~ core *.core
09:06:44: The process "/usr/bin/make" exited normally.
09:06:44: Configuration unchanged, skipping qmake step.
09:06:44: Starting: "/usr/bin/make"
/Users/alexjohnson/Qt/5.5/clang_64/bin/uic ../AISweeper/ui/sweeper_control_window.ui -o ui_sweeper_control_window.h
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -c -pipe -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7 -Wall -W -fPIC -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../AISweeper -I. -I../../../Qt/5.5/clang_64/lib/QtWidgets.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtGui.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtCore.framework/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/AGL.framework/Headers -I. -I../../../Qt/5.5/clang_64/mkspecs/macx-clang -F/Users/alexjohnson/Qt/5.5/clang_64/lib -o player_abstract.o ../AISweeper/src/players/player_abstract.cpp
   *snip*
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -c -pipe -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7 -Wall -W -fPIC -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../AISweeper -I. -I../../../Qt/5.5/clang_64/lib/QtWidgets.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtGui.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtCore.framework/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/AGL.framework/Headers -I. -I../../../Qt/5.5/clang_64/mkspecs/macx-clang -F/Users/alexjohnson/Qt/5.5/clang_64/lib -o moc_sweeper_game.o moc_sweeper_game.cpp
/Users/alexjohnson/Qt/5.5/clang_64/bin/moc -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -D__APPLE__ -D__GNUC__=4 -D__APPLE_CC__ -I/Users/alexjohnson/Qt/5.5/clang_64/mkspecs/macx-clang -I/Users/alexjohnson/WORKSPACE_ASJ/GitHub/AISweeper -I/Users/alexjohnson/Qt/5.5/clang_64/lib/QtWidgets.framework/Headers -I/Users/alexjohnson/Qt/5.5/clang_64/lib/QtGui.framework/Headers -I/Users/alexjohnson/Qt/5.5/clang_64/lib/QtCore.framework/Headers -I. -F/Users/alexjohnson/Qt/5.5/clang_64/lib ../AISweeper/inc/sweeper_widget.h -o moc_sweeper_widget.cpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -c -pipe -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -std=c++11 -stdlib=libc++ -mmacosx-version-min=10.7 -Wall -W -fPIC -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../AISweeper -I. -I../../../Qt/5.5/clang_64/lib/QtWidgets.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtGui.framework/Headers -I../../../Qt/5.5/clang_64/lib/QtCore.framework/Headers -I. -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/OpenGL.framework/Headers -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/AGL.framework/Headers -I. -I../../../Qt/5.5/clang_64/mkspecs/macx-clang -F/Users/alexjohnson/Qt/5.5/clang_64/lib -o moc_sweeper_widget.o moc_sweeper_widget.cpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -stdlib=libc++ -mmacosx-version-min=10.7 -Wl,-rpath,/Users/alexjohnson/Qt/5.5/clang_64/lib -o AISweeper.app/Contents/MacOS/AISweeper AISweeper player_abstract.o player_human.o player_machine_learning_ai.o player_probability_based_ai.o player_random_action_ai.o sweeper_batch_manager.o sweeper_batch_settings.o sweeper_batch_status.o sweeper_common_functions.o sweeper_control_window.o sweeper_game.o sweeper_main.o sweeper_model.o sweeper_node.o sweeper_widget.o qrc_sweeper_resources.o moc_player_abstract.o moc_player_human.o moc_player_machine_learning_ai.o moc_player_probability_based_ai.o moc_player_random_action_ai.o moc_sweeper_batch_manager.o moc_sweeper_batch_settings.o moc_sweeper_batch_status.o moc_sweeper_control_window.o moc_sweeper_game.o moc_sweeper_widget.o   -F/Users/alexjohnson/Qt/5.5/clang_64/lib -stdlib=libc++ -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework OpenGL -framework AGL
clang: error: no such file or directory: 'AISweeper'
make: *** [AISweeper.app/Contents/MacOS/AISweeper] Error 1
09:07:03: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project AISweeper (kit: Desktop Qt 5.5.0 clang 64bit)
When executing step "Make"
09:07:03: Elapsed time: 00:19.

我很难解释所有这些,但我相信这意味着Clang在链接时未能在生成的应用程序中找到'AISweeper'目录(因此提到了所有.o文件)。这似乎是由QMake项目文件中的TARGET变量控制的。如果我将此变量从“AISweeper”更改为“Foo”,则无法找到“Foo”目录。手动检查生成的应用程序后,我可以确认存在“/Users/alexjohnson/WORKSPACE_ASJ/GitHub/build-AISweeper-Desktop_Qt_5_5_0_clang_64bit-Debug/AISweeper.app/Contents/MacOS/”,但是内部没有“AISweeper”目录它。我不确定如何确保它作为构建过程的一部分存在。我也试过放弃Clang并切换到GCC,但这导致了C ++ 11,OSX和Qt之间的不兼容问题。我试过谷歌搜索问题,但大多数时候,当Clang找不到第三方库时,这个错误似乎发生了。在我的情况下,它似乎无法找到我的项目目录本身。我确实看到有人提到在Xcode中打开项目并在那里修改一些设置,但我无法直接使用Xcode打开我的项目或找到所提到的任何设置。以下是我的QMake项目文件(AISweeper.pro)的内容,以防我在此处尝试修改其他内容:

CONFIG += \
c++11

FORMS += \
ui/sweeper_control_window.ui

HEADERS += \
inc/players/player_abstract.h \
inc/players/player_human.h \
inc/players/player_machine_learning_ai.h \
inc/players/player_probability_based_ai.h \
inc/players/player_random_action_ai.h \
inc/sweeper_batch_manager.h \
inc/sweeper_batch_settings.h \
inc/sweeper_batch_status.h \
inc/sweeper_common_functions.h \
inc/sweeper_control_window.h \
inc/sweeper_game.h \
inc/sweeper_model.h \
inc/sweeper_node.h \
inc/sweeper_widget.h

QT += \
core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

LIBS += \
-stdlib=libc++

RESOURCES += \
rsc/sweeper_resources.qrc

SOURCES += \
src/players/player_abstract.cpp \
src/players/player_human.cpp \
src/players/player_machine_learning_ai.cpp \
src/players/player_probability_based_ai.cpp \
src/players/player_random_action_ai.cpp \
src/sweeper_batch_manager.cpp \
src/sweeper_batch_settings.cpp \
src/sweeper_batch_status.cpp \
src/sweeper_common_functions.cpp \
src/sweeper_control_window.cpp \
src/sweeper_game.cpp \
src/sweeper_main.cpp \
src/sweeper_model.cpp \
src/sweeper_node.cpp \
src/sweeper_widget.cpp

TARGET += \
AISweeper

TEMPLATE += \
app

我还可以尝试做些什么来解决这个问题?我只是希望这些工具能够很好地相互配合以及我的项目构建,所以我可以重新编写代码!

1 个答案:

答案 0 :(得分:0)

我通过改变" TARGET + ="解决了这个问题。 to" TARGET ="在我的项目文件中。这看起来很奇怪,我重新加入了' +'角色,清理并重建项目,以确保' +'性格确实引起了这个问题。它又开始失败了。我第二次删除它,清理并重新重建。它又开始工作了。

正如我在问题中提到的,这一直在我的Windows机器上工作而没有任何变化(包括+#39;字符)。

我不完全理解QMake过程,但似乎在某些时候Clang必须尝试解析项目文件本身并以GCC没有的方式失败。有人会认为项目文件中的所有变量都会以相同的方式处理(IE:你可以使用+ =来添加它们,即使只有一个条目),但似乎有一些东西特别对待TARGET变量的方式很奇怪。这可能是Clang或Qt Creator中的一个错误,但我无法确定,所以我还没有报告任何内容。

我对这种行为有更深入的解释感兴趣!