3

我正在使用通过 MacPorts 安装的 gcc 4.8,旧的 C++11 代码将不再编译

如果我使用没有 -std=c++11 标志的编译器,它可以很好地使用这个测试代码

#include <cctype>

int main() {
  std::isalnum('c');
  return 0;
}


[bash] g++48 test.cpp 

但是在 Mavericks 升级后,我得到以下编译错误:

[bash] g++48 -std=c++11  test.cpp 

Undefined symbols for architecture x86_64:
  "isalnum(int)", referenced from:
      _main in ccvsKeqJ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

有谁知道可能导致此问题的原因?我很感激任何帮助

4

4 回答 4

5

这与错误安装的 osx cmdline 工具无关,但正如在此 SO question中明确解释的那样,与 10.9 SDK 标头中更改的一些内联相关宏有关,特别是在 usr/include/sys/cdefs.h 中。

作为一种快速解决方法,您可以利用 GCC 的“固定包含”机制并提供稍微调整的 /usr/include/sys/cdefs.h 版本,以防止在编译 c++ 代码时出现问题,如下所示:

  1. 找到你安装的 GCC 在哪里,我将使用 GCCROOT
  2. mdkir $GCCROOT/lib/gcc/x86_64-apple-darwinXXX/4.XY/include-fixed/sys (其中 darwinXXX 取决于您编译 GCC 的位置,4.XY 是您编译的 GCC 版本)
  3. 编辑刚刚复制的文件 ..../include-fixed/sys/cdefs.h 以应用以下补丁:

    @@ -216,7 +215,7 @@
    
    #if __STDC_VERSION__ >= 199901L && (!defined(__GNUC__) || defined(__clang__))
    # define __header_inline           inline
    -#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)
    +#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) && !defined (__cplusplus)
    # define __header_inline           extern __inline __attribute__((__gnu_inline__))
    #elif defined(__GNUC__)
    # define __header_inline           extern __inline
    

这会导致在编译 c++ 代码时,展开

__header_inline --> 外部 __inline

代替

__header_inline --> extern __inline __attribute__((__gnu_inline__))

这显然会导致 GCC 不真正内联 isalnum 并因此留下对符号的链接时间依赖性,即它会尝试在某个库中找到它,从而导致链接错误。

于 2013-11-07T11:15:03.563 回答
5

OSX Mavericks 升级将清除一些 XCode 安装目录。为了恢复它们,您需要重新安装 XCode 命令行工具。

xcode-select --install

然后同意下载提示。

如果失败,您可以尝试从此处手动安装:OSX:Xcode 下载

于 2013-10-29T05:52:44.907 回答
0

Maybe you only installed the 32 bit part of gcc? Try -m32.

于 2013-10-29T07:21:13.393 回答
0

我尝试重新安装 Xcode 命令行工具,从昨天开始使用 xcode-select --install 不幸的是它也不再工作了

在此处输入图像描述

在此处输入图像描述

但后来我能够从 https://developer.apple.com/downloads/index.action

不幸的是,重新安装命令行工具也无济于事:(

我想我不会和

clang++ -std=c++11 -stdlib=libc++

直到有官方解决方案。

于 2013-10-30T00:19:15.773 回答