我有以下代码:
#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。
答案 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) 不需要它。