不要问我为什么要做我正在做的事情……那将是一个很长的故事。
目前,这篇文章的目的是学习并理解为什么事情没有按照我预期的方式进行。也许我的期望是错误的?
-
因此,最初我使用最近的编译器从源代码构建了自己的 SystemC 2.3.3 库,例如海湾合作委员会10.2.0。但是,为了保持与旧版 gcc 的向后兼容性,我请求 C++11 :
./configure CXXFLAGS="-DSC_CPLUSPLUS=201103L"
-
接下来,我想使用支持 C++11(和相同 ABI)的旧版 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
令我惊讶的是,链接失败:
libsystemc.so: undefined reference to `std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()
实际上,比较的输出
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> >::"
and
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> >::"
揭示出一些差异。事实上,前者包含std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >::basic_stringstream()
而后者则不然。
这是预期的吗?这是否意味着一般而言,这是必要的,但还不够库的生产者和使用者使用相同的 C++ 版本(和相同的 ABI)?还是还有其他我不明白的事情发生?