【发布时间】:2014-07-03 14:00:09
【问题描述】:
我从源代码构建了 gcc 4.9.0,并且还计划构建 clang 3.4.2,但是关于 libstdc++ 似乎有些问题,因为由于链接器抱怨各种未定义的引用,clang 构建很快就打包好了来自标准。
确实,然后我尝试编译和链接琐碎的程序:
#include <iostream>
int main() {
std::cout << 42;
}
再次点击链接器错误:
/tmp/ccrptgVW.o:temp.cpp:function main: error: undefined reference to 'std::cout'
/tmp/ccrptgVW.o:temp.cpp:function main: error: undefined reference to 'std::ostream::operator<<(int)'
/tmp/ccrptgVW.o:temp.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'std::ios_base::Init::Init()'
/tmp/ccrptgVW.o:temp.cpp:function __static_initialization_and_destruction_0(int, int): error: undefined reference to 'std::ios_base::Init::~Init()'
collect2: error: ld returned 1 exit status
(full gcc -v output),包括我新开发的 gcc 4.9.0 和我的 Ubuntu 库存 gcc 4.6.3。
libstdc++.so 存在,在 /usr/local/lib64:
ls /usr/local/lib64/libstd*
/usr/local/lib64/libstdc++.a
/usr/local/lib64/libstdc++.so
/usr/local/lib64/libstdc++.so.6.0.20
/usr/local/lib64/libstdc++.la
/usr/local/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6.0.20-gdb.py
并且这个目录出现在 LIBRARY_PATH 中,并在详细 gcc 输出中作为 collect2 的 -L 参数出现。
如何恢复系统的健全性并让链接器找到共享库?
【问题讨论】:
-
你是用
gcc还是g++编译的? -
是的,gcc。感谢您提出后续问题,这让我意识到我错过了显而易见的事情。好心痛,一直以来,我一直不明白 gcc 基于文件扩展名调用 g++ 和直接调用在默认选项方面有本质区别!