2013-10-27 78 views
8

EDIT2:未定义符号“在toupper” GCC 4.7 OS-X小牛10.9 C11

所以这里是该方案的一个示例:

#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; 
} 

1)铛:

clang++ -std=c++0x -stdlib=libc++ -lc++ main.cc -o main

编译得很好。

2)g++-mp-4.8 -std=c++11 main.cc -o main给出:

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

3)g++-mp-4.8 main.cc -o main编译!

任何想法设置有什么问题?

==========

别人的帮助可以了解在gcc/MacPorts的/ OS 10.9哪些改变呢?

我曾经有一些第三方库在OS 10.8的一种工作编译脚本。 最近我更新到新的osx(10.9)和gcc 4.7从macports停止链接。特别是我有:

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

这个问题非常类似于istype一提到here。 但是,似乎isspace不在libgcC++。dylib中。

任何想法什么尝试?

EDIT1:

确实,4.8解决了这一问题与isspace,但另一个浮出水面 - toupper

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

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

+1

你有没有包含头文件? – asalic

+0

是的,问题仍然存在。 – Denis

+0

顺便说一句,根据我的理解,没有标题将导致编译错误,而不是链接错误 – Denis

回答

10

有一个补丁http://trac.macports.org/ticket/41033 它解决了我的问题。 你只需要修补的文件中/usr/include/sys/cdefs.h和

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

好运更换

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

+0

,非常感谢您的回答。我将等待几天,看看是否采用了该补丁。 – Denis

0

我已经读了有关链接错误与特立独行几天了。这个问题似乎出现了一些交叉连接的工具,这些工具曾经是兼容的,但时间更长。

你试过迫使所有的工具来使用一种铛++或LLVM-G ++?

4

大多数ctype.h项目被声明为内联定义,使他们获得在编译时扩展。当您编译没有-std=c++11,它扩展为:

extern inline int 
toupper(int _c) 
{ 
     return (__toupper(_c)); 
} 

当你-std=c++11编译,它扩展为:

extern inline __attribute__((__gnu_inline__)) int 
toupper(int _c) 
{ 
     return (__toupper(_c)); 
} 

出于某种原因,G ++,然后选择忽略了完美的定义,是在那里展示。

基于评on this invalid bug,这是GCC选择不优化的代码,并寻找链接库中的一个定义。

解决方法似乎是编译至少-O1优化,这可以避免这个问题,但它是一个真正的痛苦的屁股。

现在,当我们看看之间的非C++ 11和C++ 11#定义的差异,我们可以看到,我们有一个额外的#define:

$ touch x.cc 
$ g++-4.9 -dM -E x.cc | grep STD 
#define __STDC_HOSTED__ 1 
#define __STDC__ 1 
$ g++-4.9 -std=c++11 -dM -E x.cc | grep STD 
#define __STDC_HOSTED__ 1 
#define __GNUC_STDC_INLINE__ 1 
#define __STDC__ 1 

因为一块和在10.9 SDK(usr/include/sys/cdefs.h)代码,所有在cytpe.h那些__DARWIN_CTYPE_TOP_inline得到变成__header_inline其中获得化作extern __inline __attribute__((__gnu_inline__))得益于额外的代码这一点:

#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__) 
# define __header_inline   extern __inline __attribute__((__gnu_inline__)) 

它看起来像苹果的头球攻门正试图做正确的事情,但他们没有涵盖所有的基础。有another issue,其中提到了一个类似的错误。