对 > `std::ostream::operator<<(unsigned long)' 的未定义引用

时间:2021-01-15 15:50:59

标签: c++ gcc undefined-reference

我有以下代码:

#include <sstream>
using namespace std;

int
main ()
{
        ostringstream oss;
        unsigned long k = 5;
        oss << k;
}

使用以下参数编译:

<块引用>

/usr/local/gcc-10.2.0/bin/g++ -I/usr/local/gcc-10.2.0/include -L/usr/local/gcc-10.2.0/lib64 -Wl,-rpath,/usr/local/gcc-10.2.0/lib64 -lstdc++ b.cpp

得到以下输出:

<块引用>

/tmp/cclRSXGV.o: 在函数 main': b.cpp:(.text+0x35): undefined reference to std::ostream::operator<<(unsigned long)'

<块引用>

collect2:错误:ld 返回 1 个退出状态

需要什么才能使其正确编译和链接?

使用 GNU gcc 10.2.0。

2 个答案:

答案 0 :(得分:1)

当您指定要链接的库时,顺序很重要。按这个顺序

-lstdc++ b.cpp

libstdc++ 不会解析 b.cpp 中的任何符号。指定库后记:

b.cpp -lstdc++ 

答案 1 :(得分:0)

事实证明,它将编译为:

/usr/local/gcc-10.2.0/bin/g++ -I/usr/local/gcc-10.2.0/include -L/usr/local/gcc-10.2.0/lib64 -Wl,-rpath,/usr/local/gcc-10.2.0/lib64 b.cpp -lstdc++ /usr/local/gcc-10.2.0/lib64/libstdc++.a

我只需要在 cpp 文件之后指定确切的 libstdc++.a。虽然我担心这会导致 libstdc++.a 被静态链接,但我认为不会。静态链接需要 -static-libstdc++

仍然不明白为什么我需要指定 libstdc++.a 而我之前的 gcc (4.4.7) 不需要它。

相关问题