gcc/g++ 編譯 .cpp文件

貼一段代碼

#include <iostream>

using namespace std;

struct Copyable
{
	Copyable(){}
	Copyable(const Copyable &o)
	{
		cout << "Copied" << endl;
	}

};

Copyable ReturnRValue()
{
	return Copyable();
}

void AcceptVal(Copyable)
{

}

void AcceptRef(const Copyable &){}

int main()
{
	cout << "Pass by value: " << endl;
	AcceptVal(ReturnRValue());
	cout << "Pass by reference: " << endl;
	AcceptRef(ReturnRValue());

	return 0;
}

在 VS編譯沒有問題

但是用gcc編譯報錯:

lzf@ubuntu:~/MyTest/copycons$ gcc -o test test.cpp
/tmp/ccuN8uHx.o: In function `main':
test.cpp:(.text+0x55): undefined reference to `std::cout'
test.cpp:(.text+0x5a): 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*)'
test.cpp:(.text+0x64): 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> >&)'
test.cpp:(.text+0x6f): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
test.cpp:(.text+0x95): undefined reference to `std::cout'
test.cpp:(.text+0x9a): 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*)'
test.cpp:(.text+0xa4): 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> >&)'
test.cpp:(.text+0xaf): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccuN8uHx.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x10b): undefined reference to `std::ios_base::Init::Init()'
test.cpp:(.text+0x120): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status

這裏注意,gcc和g++有點區別,後綴名爲.c和.cpp的文件,g++都會當成C++,而gcc會把.c的當成c源程序

另外,最終要的一點是,對於cpp程序,編譯的時候可以用gcc/g++,但是鏈接的時候,一定要在最後加上

"-Istdc++" ,這裏第一個字母是大些的 "I"

要這樣編譯          g++ -o test test.cpp -Istdc++

lzf@ubuntu:~/MyTest/copycons$ g++ -o test test.cpp -Istdc++
lzf@ubuntu:~/MyTest/copycons$ gcc -o test test.cpp -Istdc++
/tmp/ccP5pxZG.o: In function `main':
test.cpp:(.text+0x55): undefined reference to `std::cout'
test.cpp:(.text+0x5a): 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*)'
test.cpp:(.text+0x64): 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> >&)'
test.cpp:(.text+0x6f): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
test.cpp:(.text+0x95): undefined reference to `std::cout'
test.cpp:(.text+0x9a): 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*)'
test.cpp:(.text+0xa4): 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> >&)'
test.cpp:(.text+0xaf): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))'
/tmp/ccP5pxZG.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x10b): undefined reference to `std::ios_base::Init::Init()'
test.cpp:(.text+0x120): undefined reference to `std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
lzf@ubuntu:~/MyTest/copycons$ 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章