GCC 没有链接到 libstdc++?
GCC not linking against libstdc++?
我在 Ubuntu 16.04 (g++ 5.4) 上收到我不理解的 C++ 构建错误:
linker 错误是(采取了其中的一些,然后 运行 通过 c++filt
)
undefined reference to symbol 'std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@@GLIBCXX_3.4'
undefined reference to symbol 'std::condition_variable::notify_one()@@GLIBCXX_3.4.11'
我使用的命令链接是:gcc -std=c++11 -m64 -fPIC -std=c++11 ...
(...有所有的库,等等)
我假设我正在尝试 link 反对 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
。当我 运行 strings
反对它时,我看到 GLIBCXX_3.4
和 GLIBCXX_3.4.11
(但我真的不知道这是什么意思。)
nm 向我展示了符号(至少定义了 condition_variable
)
$ nm -DA /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | c++filt | grep condition_variable::notify_one
/usr/lib/x86_64-linux-gnu/libstdc++.so.6:00000000000b3930 T std::condition_variable::notify_one()
我 运行 readelf
我尝试 link 的所有库,它们似乎都是为相同的 ABI 构建的(GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
)
更新
我注意到第一个错误通过显式 linking 反对 libstd++.so
得到解决(即 我将 stdc++
添加到我的 target_link_libraries
在 CMake 中)。我的印象是我永远不必这样做?
tl;dr:调用 g++
而不是 gcc
以避免此问题
(基于@SergeyA 的评论)
GCC 的行为有所不同,具体取决于您 运行 它是 gcc
还是 g++
二进制文件。具体来说,它显然不会针对其捆绑的 C++ 标准库 libstdc++
自动 link。我猜它会 link 反对它的 C 标准库——这对你帮助不大。
因此,只需使用适合您的语言的二进制文件即可;指定 --std=c++whatever
是不够的。
我在 Ubuntu 16.04 (g++ 5.4) 上收到我不理解的 C++ 构建错误:
linker 错误是(采取了其中的一些,然后 运行 通过 c++filt
)
undefined reference to symbol 'std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@@GLIBCXX_3.4'
undefined reference to symbol 'std::condition_variable::notify_one()@@GLIBCXX_3.4.11'
我使用的命令链接是:gcc -std=c++11 -m64 -fPIC -std=c++11 ...
(...有所有的库,等等)
我假设我正在尝试 link 反对 /usr/lib/x86_64-linux-gnu/libstdc++.so.6
。当我 运行 strings
反对它时,我看到 GLIBCXX_3.4
和 GLIBCXX_3.4.11
(但我真的不知道这是什么意思。)
nm 向我展示了符号(至少定义了 condition_variable
)
$ nm -DA /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | c++filt | grep condition_variable::notify_one
/usr/lib/x86_64-linux-gnu/libstdc++.so.6:00000000000b3930 T std::condition_variable::notify_one()
我 运行 readelf
我尝试 link 的所有库,它们似乎都是为相同的 ABI 构建的(GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
)
更新
我注意到第一个错误通过显式 linking 反对 libstd++.so
得到解决(即 我将 stdc++
添加到我的 target_link_libraries
在 CMake 中)。我的印象是我永远不必这样做?
tl;dr:调用 g++
而不是 gcc
以避免此问题
(基于@SergeyA 的评论)
GCC 的行为有所不同,具体取决于您 运行 它是 gcc
还是 g++
二进制文件。具体来说,它显然不会针对其捆绑的 C++ 标准库 libstdc++
自动 link。我猜它会 link 反对它的 C 标准库——这对你帮助不大。
因此,只需使用适合您的语言的二进制文件即可;指定 --std=c++whatever
是不够的。