【问题标题】:clang++ 3.2 linker not finding C++ stdlibclang++ 3.2 链接器找不到 C++ 标准库
【发布时间】:2013-05-22 04:00:38
【问题描述】:

我已经在我的 Ubuntu 13.04 机器上安装了 clang 3.2,并且已经编译并构建了 libc++,一切就绪。 但是,当我尝试链接我的(非常简单的)代码时,链接器报告对 std::cout 等的引用未定义。

如果有人能告诉我我能做些什么来解决这个问题,我将非常感激——我已经尝试了我能想到的一切。

命令和输出在这里:

$ clang++ -v -stdlib=libc++ -lpthread -ldl sqlite3/sqlite3.o src/world.o -o bin/world

Ubuntu clang version 3.2-1~exp9ubuntu1 (tags/RELEASE_32/final) (based on LLVM 3.2)

Target: x86_64-pc-linux-gnu

Thread model: posix

 "/usr/bin/ld" -z relro --hash-style=gnu --build-id --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -o bin/world /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crti.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtbegin.o -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7 -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu -L/lib/x86_64-linux-gnu -L/lib/../lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../.. -L/lib -L/usr/lib -lpthread -ldl sqlite3/sqlite3.o src/world.o -lc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/crtend.o /usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crtn.o

src/world.o: In function `main':

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::cout'

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

/home/douglivesey/work/home/cpp/clang/biots/src/world.cpp:17: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'

src/world.o: In function `__cxx_global_var_init':

/usr/include/c++/4.7.3/iostream:74: undefined reference to `std::ios_base::Init::Init()'

/usr/include/c++/4.7.3/iostream:74: undefined reference to `std::ios_base::Init::~Init()'

clang: error: linker command failed with exit code 1 (use -v to see invocation)

make: *** [bin/world] Error 1

【问题讨论】:

    标签: c++ linker clang undefined-reference libc++


    【解决方案1】:

    错误显示来自 GCC 的 libstdc++ 的标头和符号,表明 world.o 是使用 -stdlib=libstdc++ 构建的,但您链接的是不兼容的 -stdlib=libc++

    您需要始终使用相同的-stdlib 选项。

    【讨论】:

    • 有趣,干杯。编译 world.o 的命令正确使用它,如下所示:clang++ -v -stdlib=libc++ -lpthread -ldl sqlite3/sqlite3.o src/world.o -o bin/world 但是,它链接的文件 sqlite3.o 使用clang -c -o sqlite3/sqlite3.o sqlite3/sqlite3.c 编译,因为它是一个 C 文件。这可能与问题有关吗?
    • +1 因为它也解决了我的问题。但是您(或任何人)如何从错误消息中得知编译和链接是使用不同的标头/库完成的?
    • @Arbalest,因为我知道/usr/include/c++/4.7.3/iostream 是来自 GCC 4.7.3 的 libstdc++ 附带的头文件的路径,如果代码引用了 libstdc++ 头文件中定义的内容,那么它一定是使用 libstdc++ 编译的,但链接器命令显示-std=libc++
    猜你喜欢
    • 2017-05-30
    • 2012-02-12
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    相关资源
    最近更新 更多