簡體   English   中英

在OSX上構建時,為什么Clang不為此Qt項目生成TARGET目錄?

[英]Why doesn't Clang generate the TARGET directory for this Qt project when building on OSX?

我有一個使用以下工具鏈的項目( 此處為完整代碼 ):

  • OSX 10.10.5(優勝美地)
  • 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之間的不兼容問題。 我已經嘗試使用Google搜索該問題,但是大多數情況下,當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

我還能嘗試做些什么來解決這個問題? 我只希望這些工具相互配合,並讓我的項目能夠很好地發揮作用,所以我可以重新開始編碼!

我通過在項目文件中將“ TARGET + =“更改為“ TARGET =”)解決了此問題。 這似乎很奇怪,我重新添加了'+'字符,清理並重建了項目,以確保'+'字符確實引起了問題。 它再次開始失敗。 我第二次將其刪除,進行了清理,然后再次重建。 它再次開始工作。

正如我在問題中提到的那樣,它可以在Windows計算機上正常運行,而無需進行任何更改(包括'+'字符)。

我不完全了解QMake流程,但似乎Clang在某些時候必須嘗試解析項目文件本身,並且以GCC不能的方式失敗。 有人會認為項目文件中的所有變量都將以相同的方式處理(即:即使只有一個條目,您也可以使用+ =來添加變量),但是這種方式似乎有些奇怪TARGET變量被特別對待。 這可能是Clang或Qt Creator中的錯誤,但我不確定,因此我將不作任何報告。

我會對聽到對此行為的更深入的解釋很感興趣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM