繁体   English   中英

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

[英]Undefined symbol “toupper” in MacPorts GCC 4.7 OS-X Mavericks 10.9 C11

EDIT2:

所以这是一个程序的例子:

#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:

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)和macports的gcc 4.7停止链接。 特别是我有:

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

这个问题是非常相似提到的在这里istype 然而似乎isspace不在libgcc ++。dylib中。

任何想法尝试什么?

EDIT1:

确实,4.8修复了isspace的问题,但另一个浮出水面 - toupper

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

这里发生了什么?!。 它与新的Xcode(5.0)有关吗?

http://trac.macports.org/ticket/41033上有一个补丁它解决了我的问题。 您只需要在/usr/include/sys/cdefs.h中修补该文件并替换

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

通过

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

祝好运。

大多数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 ++然后选择忽略那里提出的完美的定义。

根据对此无效错误的评论,gcc选择不优化代码并在其中一个链接库中查找定义。

一个解决方法似乎是使用至少-O1优化进行编译,这避免了这个问题,但这是一个真正的麻烦。

现在,当我们看看非C ++ 11和C ++ 11之间#defines的差异时,我们发现我们有一个额外的#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 )中的一段代码, __DARWIN_CTYPE_TOP_inline中的所有cytpe.h都变成了__header_inline ,后者变成了extern __inline __attribute__((__gnu_inline__))这要归功于这个一些额外的代码:

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

看起来苹果公司的标题试图做正确的事情,但他们并未涵盖所有基础。 还有另一个问题 ,提到了一个类似的错误。

我已经阅读了与特立独行的链接器错误了几天了。 问题似乎与某些交叉链接工具一起出现,这些工具曾经兼容,但更长。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM