【问题标题】:Undefined symbol “toupper” in MacPorts GCC 4.7 OS-X Mavericks 10.9 C11MacPorts GCC 4.7 OS-X Mavericks 10.9 C11 中未定义的符号“toupper”
【发布时间】:2023-04-07 00:19:01
【问题描述】:

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++ -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 中工作的第三方库的编译脚本。 最近我从 macports 更新到新的 osx (10.9) 和 gcc 4.7 停止链接。特别是我有:

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

这个问题与here 提到的istype 非常相似。 但是,isspace 似乎不在 libgcc++.dylib 中。

有什么想法可以尝试吗?

编辑1:

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

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

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

【问题讨论】:

  • 您是否包含了 标头?
  • 是的,问题仍然存在。
  • 顺便说一句,据我了解,与链接错误相反,没有标头会导致编译错误
  • 我在相同的环境中遇到了同样的问题(来自 OS X 10.9 上 macports 的 gcc4.7)。同时它使用 clang 或 gcc 4.8 编译没有错误。
  • 我的设置是来自 Homebrew 的 OS X 10.9、Xcode 5.0.1、gcc-4.9(快照 20131027),我还得到了一个未定义的 topper() 符号 ...

标签: c++ macos gcc xcode5 macports


【解决方案1】:

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)

祝你好运。

【讨论】:

  • 非常感谢您的回答。我会等几天看看补丁是否被采纳。
【解决方案2】:

大部分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 差异时,我们发现我们有一个额外的#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,里面提到了一个类似的bug。

【讨论】:

    【解决方案3】:

    几天来,我一直在阅读有关 maverick 的链接器错误的信息。这个问题似乎是由于某些工具交叉链接而出现的,这些工具过去是兼容的,但现在已经兼容了。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 2013-11-03
      • 1970-01-01
      • 2013-11-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 2013-11-10
      相关资源
      最近更新 更多