2013-10-27 15 views
8

EDIT2:未定義シンボル「TOUPPER」MacPortsの中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で使用していました。 最近macportsがリンクを停止して新しいosx(10.9)とgcc 4.7に更新されました。特に、私が持っている:

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

btw、私の理解では、ヘッダーがないと、リンクエラーではなくコンパイルエラーが発生する – 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

私はリンカのエラーをmaverickで数日間読んできました。この問題は、以前は互換性のあるツールのクロスリンクを使用していましたが、長くなっています。

すべてのツールでclang ++または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)); 
} 

、グラム++が続いている完璧な定義を無視することを選んでいますそこに提示された。

解説on this invalid bugに基づいて、gccはコードを最適化せず、リンクされたライブラリの1つで定義を探します。

回避策は少なくとも-O1の最適化でコンパイルすることですが、これは問題を回避しますが、お尻には本当の痛みです。

$ 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 

と理由ピース:我々は非C++ 11とC++ 11の間の#defineの違いを見ると

は今、私たちは余分に#defineを持っていることがわかり10.9 SDK(usr/include/sys/cdefs.h)内のコードを、cytpe.h内のすべてのものを__DARWIN_CTYPE_TOP_inline__header_inlineになってます追加コードのこの小さなビットにextern __inline __attribute__((__gnu_inline__))おかげになってますた:Appleのヘッダがやろうとしているように見えます

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

彼らはすべての基盤をカバーしていない。 another issueがあり、同様のバグがあります。

関連する問題