不要问我为什么要做我正在做的事情……那将是一个很长的故事。目前,这篇文章的目的是学习并理解为什么事情没有按照我预期的方式进行。也许我的期望是错误的?
因此,最初我使用最新的编译器(例如gcc 10.2.0 )从源代码构建了自己的 SystemC 2.3.3 库。但是,为了保持与旧版 gcc 的向后兼容性,我请求 C++11 :
./configure CXXFLAGS="-DSC_CPLUSPLUS=201103L"
Run Code Online (Sandbox Code Playgroud)
接下来,我想使用支持 C++11(和相同 ABI)的旧版 gcc 构建一个应用程序,例如gcc 8.2.0:
g++ -std=c++11 sc_main.cpp -I/path/to/systemc/include -L/path/to/systemc/lib -lsystemc -lm -o sim
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,链接失败:
libsystemc.so: undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()
Run Code Online (Sandbox Code Playgroud)
实际上,比较的输出
nm --demangle `/path/to/gcc/10.2.0/bin/g++ --print-file-name libstdc++.so` | grep "std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::"
Run Code Online (Sandbox Code Playgroud)
和
nm --demangle `/path/to/gcc/8.2.0/bin/g++ --print-file-name libstdc++.so` | grep "std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::"
Run Code Online (Sandbox Code Playgroud)
揭示出一些差异。事实上,前者包含std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()而后者不包含。
这是预期的吗?这是否意味着一般来说,库的生产者和使用者使用相同的 C++ 版本(和相同的 ABI)是必要的但还不够?还是还有其他我不明白的事情发生?