C++ 未定义的符号“;toupper”;在MacPorts GCC 4.7 OS-X Mavericks 10.9 C11中
编辑2: 下面是一个程序示例: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
#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)