2012-01-18 95 views
4

我一直在XCode開發一個學校項目。最終產品必須在源代碼中用makefile提交,所以我寫了一個makefile並開始編譯,以確保我有一個工作副本。這裏是我的makefile:GCC鏈接器找不到標準庫?

all: main.o StackList.o world.o Farm.o 
     gcc main.o StackList.o world.o Farm.o -g -o Project1 

main.o: 
     gcc -g -c main.cpp 

StackList.o: 
     gcc -g -c Stacklist.cpp 

world.cpp: 
     gcc -g -c world.cpp 

Farm.cpp: 
     gcc -g -c Farm.cpp 

clean: 
     rm *.o Project1 

編譯每個目標文件的正常工作,但是當它到達「所有」的鏈接步驟,它似乎不知道標準庫的。從「cin」,到「basic_string」,到「operator new」,我得到了「未定義符號」的錯誤。

我的印象是,這些東西不需要直接指出,事實上過去並不需要這樣做。

任何想法可能發生什麼?

編輯:

如果有幫助,這裏的(很長的)錯誤消息的開始:

Undefined symbols for architecture x86_64: 
    "std::cin", referenced from: 
    _main in main.o 
    "std::cout", referenced from: 
     _main in main.o 
     Farm::print(int) in Farm.o 
    "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from: 
     _main in main.o 
    "std::ios_base::Init::Init()", referenced from: 
     __static_initialization_and_destruction_0(int, int)in main.o 
     __static_initialization_and_destruction_0(int, int)in StackList.o 
     __static_initialization_and_destruction_0(int, int)in world.o 
     __static_initialization_and_destruction_0(int, int)in Farm.o 
    "std::ios_base::Init::~Init()", referenced from: 
     ___tcf_0 in main.o 
     ___tcf_0 in StackList.o 
     ___tcf_0 in world.o 
     ___tcf_0 in Farm.o 
    "operator new(unsigned long)", referenced from: 
     doStackSearch(std::basic_istream<char, std::char_traits<char> >*, std::list<Farm*, std::allocator<Farm*> >*&)in world.o 

回答

19

要鏈接C++代碼,你需要使用g++命令,而不是gcc命令。

編譯時,該gcc命令才能知道它在編譯C++代碼,因爲.cpp後綴(但它無論如何使用g++命令一個好主意)。

鏈接時,gcc命令只看到一堆.o文件。 g++命令不同於gcc命令,因爲它知道在哪裏可以找到C++特定的庫。

(這個名字gcc既指命令,通常用來編譯C代碼,以及「GNU編譯器集」作爲一個整體的事實,可以是一個有點混亂。)

+0

對不起,這確實解決了這個愚蠢的問題。這只是令人沮喪的,因爲之前我已經使用過GCC for C++,而且我的講師告訴我們GCC和G ++在必要時會互相調用,並且基本相同。非常感謝! – xanderflood

1

您需要使用g++來編譯和鏈接C++源代碼,而不是gcc

另外,除了第一個和最後一個之外,您可以省略所有目標。 make知道如何編譯.cpp文件到.o已經 - 你不必告訴它如何。

-2
gcc main.o StackList.o world.o Farm.o -g -o Project1 

在這個命令行中,你認爲什麼告訴gcc鏈接在C++標準庫中?沒有C++文件被鏈接。你還沒有指定一種語言。你調用了編譯器gcc