关注到这个问题,是在测试以下代码时发现的:
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++的区别和联系做了详细分析。