gcc和g++的区别与联系

关注到这个问题,是在测试以下代码时发现的:

static_test.cpp//测试private修饰的静态数据成员访问方法。

#include <iostream>
using namespace std;
 
class test
{
public:
	static int i;
	test() {}
	void print();
	static void print_j();
private:
	static int j;
};
 
int test::i = 0;
int test::j = 0;
 
void test::print()
{
	cout << "print() i = "<< i << endl;
//cout << "j = "<< j << endl;
	
}
 
void test::print_j()
{
	cout << "print_j():j = "<< test::j << endl;

}


int main()
{
	test t;
	t.print();
 
	cout << "main : i = "<< t.i << endl;
	//cout << "j = "<< t.j << endl;//测试是否可以不受private作用
	test::print_j();//static方法访问

	return 0;
}

指令:

gcc -o staic_test.o static_test.cpp 

会报以下错误

/tmp/ccm1seNZ.o:在函数‘test::print()’中:
static_test.cpp:(.text+0x19):对‘std::cout’未定义的引用
static_test.cpp:(.text+0x1e):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
static_test.cpp:(.text+0x28):对‘std::ostream::operator<<(int)’未定义的引用
static_test.cpp:(.text+0x2d):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
static_test.cpp:(.text+0x35):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccm1seNZ.o:在函数‘test::print_j()’中:
static_test.cpp:(.text+0x57):对‘std::cout’未定义的引用
static_test.cpp:(.text+0x5c):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
static_test.cpp:(.text+0x66):对‘std::ostream::operator<<(int)’未定义的引用
static_test.cpp:(.text+0x6b):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
static_test.cpp:(.text+0x73):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccm1seNZ.o:在函数‘main’中:
static_test.cpp:(.text+0xbb):对‘std::cout’未定义的引用
static_test.cpp:(.text+0xc0):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
static_test.cpp:(.text+0xca):对‘std::ostream::operator<<(int)’未定义的引用
static_test.cpp:(.text+0xcf):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
static_test.cpp:(.text+0xd7):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccm1seNZ.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
static_test.cpp:(.text+0x123):对‘std::ios_base::Init::Init()’未定义的引用
static_test.cpp:(.text+0x132):对‘std::ios_base::Init::~Init()’未定义的引用
collect2: error: ld returned 1 exit status
yuan@linx-c:~/VSCode/CPP_Learning/static_test$ gcc -c staic_test.o static_test.cpp 
gcc: error: staic_test.o: 没有那个文件或目录
yuan@linx-c:~/VSCode/CPP_Learning/static_test$ gcc -o staic_test.o static_test.cpp 
/tmp/ccfUlQxD.o:在函数‘test::print()’中:
static_test.cpp:(.text+0x19):对‘std::cout’未定义的引用
static_test.cpp:(.text+0x1e):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
static_test.cpp:(.text+0x28):对‘std::ostream::operator<<(int)’未定义的引用
static_test.cpp:(.text+0x2d):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
static_test.cpp:(.text+0x35):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccfUlQxD.o:在函数‘main’中:
static_test.cpp:(.text+0x7d):对‘std::cout’未定义的引用
static_test.cpp:(.text+0x82):对‘std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)’未定义的引用
static_test.cpp:(.text+0x8c):对‘std::ostream::operator<<(int)’未定义的引用
static_test.cpp:(.text+0x91):对‘std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)’未定义的引用
static_test.cpp:(.text+0x99):对‘std::ostream::operator<<(std::ostream& (*)(std::ostream&))’未定义的引用
/tmp/ccfUlQxD.o:在函数‘__static_initialization_and_destruction_0(int, int)’中:
static_test.cpp:(.text+0xe0):对‘std::ios_base::Init::Init()’未定义的引用
static_test.cpp:(.text+0xef):对‘std::ios_base::Init::~Init()’未定义的引用

采用:

g++ -o staic_test.o static_test.cpp 

gcc -o staic_test.o static_test.cpp -lstdc++

可正常编译通过。

分析:

gcc命令不能自动和C++程序使用的库联接,所以使用gcc编译c++代码时,通常需要增加-lstdc++选项,或者直接使用g++来完成联接。

g++在编译阶段,会自动调用gcc。

 

可参考文章https://www.cnblogs.com/liushui-sky/p/7729838.html   ,该文章对gcc和g++的区别和联系做了详细分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值