小牛队的C ++ 11发生了什么奇怪的事情?

时间:2013-10-29 04:01:13

标签: c++ c++11 osx-mavericks g++4.8

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

如果我使用没有-std = c ++ 11标志的编译器,它可以正常使用此测试代码

#include <cctype>

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


[bash] g++48 test.cpp 

但在小牛队升级之后我得到以下编译错误:

[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 个答案:

答案 0 :(得分:5)

OSX Mavericks升级将消灭许多XCode安装目录。要恢复它们,您需要重新安装XCode命令行工具。

xcode-select --install

然后同意下载提示。

如果失败,您可以尝试从这里手动安装:OSX: Xcode Downloads

答案 1 :(得分:5)

这与错误安装的osx cmdline工具无关,但正如在this 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
    
  4. 这在编译c ++代码时会导致扩展

      

    __ header_inline - &gt; extern __inline

    而不是

      

    __ header_inline - &gt; extern __inline __attribute __((__ gnu_inline __))

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

答案 2 :(得分:0)

也许你只安装了gcc的32位部分?试试-m32。

答案 3 :(得分:0)

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

enter image description here

enter image description here

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

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

我想我不会选择

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

直到有官方解决方案。