gcc升级后静态库要升级吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc升级后静态库要升级吗相关的知识,希望对你有一定的参考价值。
参考技术A gcc升级后静态库需要升级源码编译升级安装了gcc后,编译程序或运行其它程序时,有时会出现类似/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21\' not found的问题。这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、 Objective-C、 Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++,libgcj等。)
升级到 Xcode 8 后出现 GCC 5.4 链接器错误
【中文标题】升级到 Xcode 8 后出现 GCC 5.4 链接器错误【英文标题】:GCC 5.4 linker error after upgrading to Xcode 8 【发布时间】:2016-09-21 06:00:23 【问题描述】:最近我在 El Capitan(使用 Macports 2.3.4 的 OS X 10.11)上更新到 XCode 版本 8.0 (8A218a),从那时起,当我尝试在 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 之前一切都很好。现在我不确定如何解决这个问题。我将不胜感激这方面的任何帮助。谢谢。
更新:
这似乎不是我链接的任何外部库的问题。这就是我所做的。我在QtCreator中新建了一个“QT widgets application”,并选择用gcc5编译。我得到同样的错误ld: unexpected token: !tapi-tbd-v2
。如果我切换到clang,那就没有错误了。
【问题讨论】:
我还没有看到类似的东西。我最喜欢的变化是dsymutil
如果我创建一个(静态)库然后更新其中一个成员,它的行为特别 - 库第一次创建时没问题,但更新后就不行了,只有更新的成员悲伤。我还没有获得它的 MCVE。另一个问题是如果我尝试 32 位构建而不是 64 位构建;然后我被告知warning: section "__textcoal_nt" is deprecated
— .section __TEXT,__textcoal_nt,coalesced,pure_instructions
— note: change section name to "__text"
。 (自制 GCC 6.2.0。)
这对您没有多大帮助,但表明 (a) 并非每个人都遇到过您的特定问题,并且 (b) 可能还有其他问题您仍然可能遇到,并且 (c ) 有些人已经看了看他们是否可以提供帮助。
得到非常相似的错误:升级到 xcode 8 (El Capitan 10.11.6) 升级后我现在在我的 ios 项目 (.cpp / .hpp) 中使用了几个 C++ 文件,所有突然的 xcode 说我的 CPP Header "#include 我在构建一个不相关的项目时遇到了这个“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】:昨天遇到了同样的问题。我的系统上有 XCode 7.3 和 8。删除 7.3 并将 8 移动到应用程序位置解决了问题。
【讨论】:
【参考方案3】:我遇到了同样的问题。我使用 macport 的 GCC 6 作为编译器和链接器。 GCC 似乎不理解新的 tbd 格式。在 MacOSX SDK 路径中,现在只有这些 tbd 文本文件,其中包含有关真实 dylib 库的信息。所以我只是将真正的库符号链接到它们的 tbd 文件旁边的 SDK 路径。那么GCC可以直接使用真实的库而不需要解析tbd文件。
这是创建这些符号链接的脚本: https://gist.github.com/michalfapso/9abdbd5669bfdc4cd1a2179824d299e9
【讨论】:
我尝试了你的脚本,但仍然遇到同样的错误......哎呀。 (尝试构建 gcc5,以便我以后可以用它编译 mingw64 gcc...facepalm)【参考方案4】:我在使用 opam 编译时遇到了同样的问题。
解决方法是PATH=/usr/bin:$PATH
,因此gcc
将解析为默认的/usr/bin/gcc
,即macOS 上的clang
。
【讨论】:
以上是关于gcc升级后静态库要升级吗的主要内容,如果未能解决你的问题,请参考以下文章