2013-10-27 116 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,其中提到了一個類似的錯誤。