2011-07-15 15 views
8

我在main.cpp中下面的代碼:只使用++作品克,但不是 「G ++ -c」 和ld

#include <iostream> 
#include <iomanip> 

int main() { 
    std::cout << "Hi" << std::endl; 
    return 0; 
} 

使用此命令的工作,並創建可執行文件:

g++ -o main main.cpp 

但這命令不起作用:與

g++ -c main.cpp 
ld -o main main.o 

第二個錯誤:

ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8 
main.o: In function `main': 
main.cpp:(.text+0xa): undefined reference to `std::cout' 
main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' 
main.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' 
main.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' 
main.o: In function `__static_initialization_and_destruction_0(int, int)': 
main.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()' 
main.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()' 
main.cpp:(.text+0x54): undefined reference to `__dso_handle' 
main.cpp:(.text+0x61): undefined reference to `__cxa_atexit' 
+2

ld不知道libstdC++ –

+0

不要直接調用ld,除非你真的需要它。 –

回答

13

我想如果你直接使用ld它默認不包含C++庫。您也可以使用g++進行鏈接,它將使用正確的設置調用ld

g++ -c main.cpp 
g++ -o main main.o 
7

當您使用g++,它也鏈接該連接器用來解析名稱的libstd++庫。但使用g++ -c,然後ld不要自動鏈接庫。您必須現在手動鏈接庫。

嘗試(未經測試):

ld -o main main.o -llibstd++ 

或者你也可以通過閱讀本手冊看看正確的語法:

+0

與libstdC++庫鏈接的標誌是-lstdC++ – hailinzeng

1

好了,你沒有鏈接標準庫。 g++會自動爲您做這件事;這就是我們使用它的原因:它將打電話給ccplus1ld與所有額外的照顧。

BTW,嚴格來講,g++ main.cpp -o main可等效爲:

cc1plus main.cpp -o main.o 
ld -o main main.o 

cc1plus可能不是你的道路上,我找到了我在/usr/libexec/gcc/i386-redhat-linux/4.1.1/

g++ -c main.cpp做傳統執行第一步。 g++ main.cpp -o main包裝。

g++是一個包裝到個別編譯和鏈接工具,調整爲C++。因此,它提供了論據cc1plusld它認爲合適的,包括參數的C++標準庫中鏈接:

ld -o main main.o -llibstd++ 

它也將在運行時可能還有一些其他的東西聯繫起來。

一般來說,沒有必要親自嘗試去做這些事情:讓g++負責它。

12

GCC內部鏈接一些額外的庫和對象文件。要查看它們是什麼,請執行-###,它將打印它將執行的工具命令,包括鏈接器。我的GCC使用的連接器命令是(我做了.o文件,我調用了g++加粗了,所以你可以很容易地發現它)。

/usr/lib/gcc/i686-pc-linux-gnu/4.6.0/collect2 --build-ID --eh幀-HDR -m elf_i386 「--hash式都=」 -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/../../../crt1.o/usr/lib/gcc/i686-pc-linux-gnu/4.6.0 /../../../ crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/crtbegin.o -L /usr/lib/gcc/i686-pc-linux-gnu/4.6.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.6.0 /../../ .. main1。 o「-lstdC++」-lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/crtend.o/usr/lib/gcc/i686-pc -linux-gnu/4.6.0 /../../../ crtn.o

您可以用collect2路徑由ld(如果我沒有記錯,collect2只是作爲真正的ld由不支持現代二進制格式的GCC後端代理,收集構造函數和析構函數根據其錯位名稱。 ELF格式有本地部分支持)。

執行該命令,ld字面替換成功鏈接可執行文件。

相關問題