升级到Xcode 8后,GCC 5.4链接器错误

时间:2016-09-21 06:00:23

标签: c++ macos qt linker-errors xcode8

最近我更新了El Capitan的XCode版本8.0(8A218a)(使用Macports 2.3.4的OS X 10.11),从那时起,当我尝试在Qt Creator中编译我的项目时,我收到了以下链接错误。

/opt/local/bin/g++-mp-5 -headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk -mmacosx-version-min=10.8 -Wl,-rpath,/Users/zero/builds/Qt5.7.0/5.7/clang_64/lib -o uniMR.app/Contents/MacOS/uniMR ALL_OBJECT_FILES_GO_HERE.o -F/Users/zero/builds/Qt5.7.0/5.7/clang_64/lib -L/opt/local/lib -L/usr/local/lib -funit-at-a-time -fopenmp -lmlpack -larmadillo -framework CoreFoundation -DNDEBUG -lpthread -lALL_ITK_LIBS_GO_HERE -framework QtOpenGL -framework QtWidgets -framework QtGui -framework QtCore -framework DiskArbitration -framework IOKit -framework QtXml -framework OpenGL -framework AGL **ld: unexpected token: !tapi-tbd-v2 file '/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/System/Library/Frameworks//CoreFoundation.framework/CoreFoundation.tbd' for architecture x86_64 collect2: error: ld returned 1 exit status make: *** [uniMR.app/Contents/MacOS/uniMR] Error 1**

我正在使用QtCreator(Qt 5.7)中的gcc 5.4(不是clang)编译主项目,并且所有依赖库(ITK,BOOST等)也使用gcc 5.4编译。升级XCode后,我还重新编译了所有依赖库,但这也无济于事。我只能找到一个与我看到的错误相关的帖子,但它似乎没有用: https://trac.macports.org/ticket/51701

在升级XCode之前一切都很好。现在我不确定如何解决这个问题。我将不胜感激任何帮助。感谢。

UPDATE:

这似乎与我链接的任何外部库都存在问题。这就是我做的。我在QtCreator中创建了一个新的“QT小部件应用程序”,并选择使用gcc5进行编译。我得到了同样的错误ld: unexpected token: !tapi-tbd-v2。如果我切换到clang,则没有错误。

4 个答案:

答案 0 :(得分:1)

昨天有同样的问题。我的系统上有XCode 7.3和8。删除7.3并将8移动到应用程序位置解决了这个问题。

答案 1 :(得分:1)

我有这个“ld:意外令牌:!tapi-tbd-v2”错误构建一个不相关的项目,并且能够通过编辑给出错误的框架的.tbd文件来解决它。 对我来说,该文件是: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate.tbd 我只是在建造时删除整条线“---!tapi-tbd-v2”,然后在完成后将其放回去。

答案 2 :(得分:1)

我遇到了同样的问题。我使用macport的GCC 6作为编译器和链接器。看来GCC并不了解新的tbd格式。在MacOSX SDK路径中,现在只有这些tbd文本文件包含有关真实dylib库的信息。所以我只是将真正的库符号链接到他们的tbd文件旁边的SDK路径。然后GCC可以直接使用真实的库而无需解析tbd文件。

这是一个用于创建这些符号链接的脚本: https://gist.github.com/michalfapso/9abdbd5669bfdc4cd1a2179824d299e9

答案 3 :(得分:0)

使用opam进行编译时遇到了同样的问题。

解决方法为PATH=/usr/bin:$PATH,因此gcc将解析为macOS上/usr/bin/gcc的默认clang