如果对于编译比较熟悉的话,应该是知道这是在链接时找不到符号导致的错误,一般是没有链接动态库导致的错误。而比较奇怪的是,提示的只有这一个函数,如果是没有链接相关的动态库,应该是有更多的提示,而不是仅仅只有这一条。然后想到更换了标准库,猜想应该是std::string在编译时符号不一致导致的。
经过验证的确如此。通过对以下文件分别使用不同的库进行编译。
#include <thread> #include <iostream> #include <string> #include <chrono> #include <vector> #include <boost/timer/timer.hpp> using namespace std::chrono_literals; boost::timer::auto_cpu_timer timer; int my_func(std::string data); int main() { my_func("test"); return 0; }得到的报错分别是:
libc++
undefined reference to `my_func(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >)'而libstdc++
undefined reference to `my_func(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)'可以看到差别,如果编译成汇编文件,还可以看到更加详细的差别。总之,不同的标准库无法简单的混编。也许Modules能解决这一问题吧。
博客原文:https://www.cnblogs.com/ink19/p/std_thread-5.html