C++ 未定义的符号“;toupper”;在MacPorts GCC 4.7 OS-X Mavericks 10.9 C11中

C++ 未定义的符号“;toupper”;在MacPorts GCC 4.7 OS-X Mavericks 10.9 C11中,c++,macos,gcc,xcode5,macports,C++,Macos,Gcc,Xcode5,Macports,编辑2: 下面是一个程序示例: #include <stdio.h> #include <ctype.h> int main () { int i=0; char str[]="Test String.\n"; char c; while (str[i]) { c=str[i]; putchar (toupper(c)); i++; } return 0; } 3) g++-mp-4.8 main.cc-o main

编辑2:

下面是一个程序示例:

#include <stdio.h>
#include <ctype.h>
int main ()
{
  int i=0;
  char str[]="Test String.\n";
  char c;
  while (str[i])
  {
    c=str[i];
    putchar (toupper(c));
    i++;
  }
  return 0;
 }
3)
g++-mp-4.8 main.cc-o main
编译

你知道设置有什么问题吗

==========

有人能帮助理解Gcc/macports/os 10.9中发生了什么变化吗

我曾经有一个在os 10.8中运行的第三方库的编译脚本。 最近,我从macports更新到新的osx(10.9)和GCC4.7停止链接。我特别:

Undefined symbols for architecture x86_64:
 "isspace(int)", referenced from:
这个问题与所提到的
istype
的问题非常相似。 然而,
isspace
似乎不在libgcc++.dylib中

有什么想法可以试试吗

编辑1:

事实上,4.8修复了
isspace
的问题,但另一个问题出现了-
toupper

Undefined symbols for architecture x86_64:
  "toupper(int)", referenced from: ...

这是怎么回事?!。它与新的Xcode(5.0)有关吗?

我已经读了几天maverick的链接器错误。问题似乎出现在某些工具的交叉链接上,这些工具过去是兼容的,但现在不再兼容了


您是否尝试过强制所有工具使用一种类型clang++或llvm-g++?

大多数
ctype.h
项都声明为内联定义,因此它们在编译时会被扩展。如果编译时不使用
-std=c++11
,它将扩展为:

extern inline int 
toupper(int _c) 
{ 
        return (__toupper(_c)); 
} 
extern inline __attribute__((__gnu_inline__)) int 
toupper(int _c) 
{ 
        return (__toupper(_c)); 
}
使用
-std=c++11
编译时,它将扩展为:

extern inline int 
toupper(int _c) 
{ 
        return (__toupper(_c)); 
} 
extern inline __attribute__((__gnu_inline__)) int 
toupper(int _c) 
{ 
        return (__toupper(_c)); 
}
出于某种原因,g++选择忽略这里给出的完美定义

根据评论,gcc选择不优化代码,而是在其中一个链接库中查找定义

一个解决办法似乎是至少使用
-O1
优化进行编译,这样可以避免问题,但这确实是一个麻烦

现在,当我们看一下非C++11和C++11之间的#定义差异时,我们会发现我们有一个额外的#定义:

由于10.9SDK(
usr/include/sys/cdefs.h
)中的一段代码,
cytpe.h
中的所有
\uuuuu DARWIN\u CTYPE\u TOP\u inline
都变成了
\uu header\u inline
,变成了
extern\uuu inline\uu属性((\uu gnu inline\uuu inline))
,多亏了这一点额外的代码:

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)
# define __header_inline           extern __inline __attribute__((__gnu_inline__))
看起来苹果的头球正试图做正确的事情,但他们并没有覆盖所有的基础。有,它提到了一个类似的bug。

中有一个补丁 它解决了我的问题。 只需在/usr/include/sys/cdefs.h中修补文件并替换即可

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)


祝您好运。

是否包含标题?是的,问题仍然存在。顺便说一句,据我所知,缺少标题会导致编译错误,而不是链接错误。我在相同的环境中遇到了相同的问题(操作系统X 10.9上macports的gcc4.7)。同时,它使用clang或gcc 4.8编译,没有错误。我的设置是来自自制的OS X 10.9、Xcode 5.0.1、gcc-4.9(快照20131027),我还得到了一个未定义的topper()符号……非常感谢您的回答。我会等几天,看看这个补丁是否被采用。
#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) && !defined(__cplusplus)