我有一些使用SystemC库的代码,当我在机器上时,它编译得很好,但是当我进入ssh时,它会抛出未定义的引用。
g++ -Wno-deprecated -O0 -g3 -I/path/to/include socex2.cpp -L/path/to/lib -lsystemc
/tmp/ccCNdiMA.o: In function `sc_dt::sc_uint_base::print(std::ostream&) const':
/path/to/include/sysc/datatypes/int/sc_uint_base.h:844: undefined reference to `sc_dt::sc_uint_base::to_string[abi:cxx11](sc_dt::sc_numrep, bool) const'
collect2: error: ld returned 1 exit status
起初我认为这是LD_LIBRARY_PATH
的问题,在〜/ .bashrc中设置为/path/to/lib
。我为〜/ .bash_profile中的〜/ .bashrc提供了非交互式会话,例如ssh。
要验证,这是/usr/bin/env
的相关位:
TERM=xterm
SHELL=/bin/bash
SSH_CLIENT=xx.xx.xx.xx 56176 22
LD_LIBRARY_PATH=/path/to/lib
SSH_CONNECTION=xx.xx.xx.xx 56176 yy.yy.yy.yy 22
_=/usr/bin/env
为什么我的程序不会链接?我正在使用的标题和库完全相同,并且在完全相同的位置。
P.S。
依赖库:
$ ldd /path/to/lib/libsystemc.so
linux-vdso.so.1 => (0x00007ffe29d36000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb9b85f5000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb9b8273000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb9b7f69000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb9b7ba0000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb9b798a000)
/lib64/ld-linux-x86-64.so.2 (0x000056093a23e000)
答案 0 :(得分:1)
...to_string[abi:cxx11] ...
两件事之一......
首先,GCC和Clang正在混合和匹配。如果您使用Clang进行编译,由于GCC5 and the C++11 ABI和LLVM Issue 23529: Add support for gcc's attribute abi_tag (needed for compatibility with gcc 5's libstdc++),这可能是可疑的。
其次,to_string
是C ++ 11,因此您需要-std=c++11
或-std=gnu++11
。如果所有其他事情都相同,C ++ 11可能是候选人。除非你-D_GLIBCXX_USE_CXX11_ABI=0
,否则它也会为你提供新的ABI。
您可能仍然遇到依赖库配置问题,并且它们可能会出现问题。