问题描述
这是在链接包含 gnu plotutils 包,特别是 libplotter 库的程序时出现的问题。
“程序”:
#include <plotter.h>
int main() {
return 0;
}
复杂命令和错误:
g++ -c test.cpp -g -O0 -std=c++17
g++ -o test test.o -L/usr/lib64 -lplotter -lxmi
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miDeletePaintedSet(lib_miPaintedSet*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miSetGCPixels(lib_miGC*,int,miPixel const*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miSetGCMiterLimit(lib_miGC*,double)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miClearPaintedSet(lib_miPaintedSet*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `micopyPaintedSetToCanvas(lib_miPaintedSet const*,miCanvas*,miPoint)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miSetGCAttrib(lib_miGC*,miGCAttribute,int)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `minewGC(int,miPixel const*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `minewCanvas(unsigned int,unsigned int,miPixel)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `minewPaintedSet()'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miSetGCAttribs(lib_miGC*,miGCAttribute const*,int const*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miDeleteGC(lib_miGC*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miDeleteCanvas(miCanvas*)'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /usr/lib64/libplotter.so: undefined reference to `miSetGCDashes(lib_miGC*,unsigned int const*,int)'
collect2: error: ld returned 1 exit status
$ grep micopyPaintedSetToCanvas /usr/include/ -Rl
/usr/include/xmi.h
两个库都存在于/usr/lib64(都通过gentoo linux包管理器安装)
$ ls /usr/lib64 | grep -e libplot -e libxmi
libplot.la
libplot.so
libplot.so.2
libplot.so.2.2.4
libplotter.la
libplotter.so
libplotter.so.2
libplotter.so.2.2.4
libxmi.so
libxmi.so.0
libxmi.so.0.1.3
链接在使用 libtool 时有效
g++ -c test.cpp -g -O0 -std=c++17
libtool --tag=CXX --mode=link x86_64-pc-linux-gnu-g++ -march=haswell -O2 -pipe -Wl,-O1 -Wl,--as-needed test.o -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lpng -lz -lxmi -lm -o test
libtool: link: x86_64-pc-linux-gnu-g++ -march=haswell -O2 -pipe -Wl,--as-needed test.o -o test -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lpng -lz -lxmi -lm
或者详细
libtool: link: x86_64-pc-linux-gnu-g++ -march=haswell -O2 -pipe -Wl,-O0 -Wl,--as-needed test.o -o test --verbose -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lpng -lz -lxmi -lm
Using built-in specs.
COLLECT_GCC=x86_64-pc-linux-gnu-g++
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: /var/tmp/portage/sys-devel/gcc-10.2.0-r5/work/gcc-10.2.0/configure --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --prefix=/usr --bindir=/usr/x86_64-pc-linux-gnu/gcc-bin/10.2.0 --includedir=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include --datadir=/usr/share/gcc-data/x86_64-pc-linux-gnu/10.2.0 --mandir=/usr/share/gcc-data/x86_64-pc-linux-gnu/10.2.0/man --infodir=/usr/share/gcc-data/x86_64-pc-linux-gnu/10.2.0/info --with-gxx-include-dir=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/include/g++-v10 --with-python-dir=/share/gcc-data/x86_64-pc-linux-gnu/10.2.0/python --enable-languages=c,c++,fortran --enable-obsolete --enable-secureplt --disable-werror --with-system-zlib --enable-nls --without-included-gettext --enable-checking=release --with-bugurl=https://bugs.gentoo.org/ --with-pkgversion='Gentoo 10.2.0-r5 p6' --disable-esp --enable-libstdcxx-time --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-multilib --with-multilib-list=m32,m64 --disable-fixed-point --enable-targets=all --enable-libgomp --disable-libssp --disable-libada --disable-systemtap --disable-vtable-verify --disable-libvtv --without-zstd --enable-lto --without-isl --enable-default-pie --enable-default-ssp
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 10.2.0 (Gentoo 10.2.0-r5 p6)
COMPILER_PATH=/usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/libexec/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/
LIBRARY_PATH=/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/:/lib/../lib64/:/usr/lib/../lib64/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/lib/:/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-march=haswell' '-O2' '-pipe' '-o' 'test' '-v' '-shared-libgcc'
/usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/collect2 -plugin /usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/liblto_plugin.so -plugin-opt=/usr/libexec/gcc/x86_64-pc-linux-gnu/10.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccxStaDw.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -o test /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/Scrt1.o /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtbeginS.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0 -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../.. -O0 --as-needed test.o -lXaw -lXmu -lXt -lSM -lICE -lXext -lX11 -lpng -lz -lxmi -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../lib64/crtn.o
COLLECT_GCC_OPTIONS='-march=haswell' '-O2' '-pipe' '-o' 'test' '-v' '-shared-libgcc'
我已经在 g++ 链接命令中测试了大部分 libtool 库选项,但这并不能解决 g++ 链接问题。
反正和libtool连接成功后,ldd没有列出libplotter库:
ldd test
linux-vdso.so.1 (0x00007ffffbda4000)
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/libstdc++.so.6 (0x00007f8c8df0a000)
libc.so.6 => /lib64/libc.so.6 (0x00007f8c8dd50000)
libm.so.6 => /lib64/libm.so.6 (0x00007f8c8dc1b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8c8e118000)
libgcc_s.so.1 => /usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/libgcc_s.so.1 (0x00007f8c8dc01000)
有人能解释一下 g++ 链接命令与使用 libtool 的工作命令相比有什么问题吗?
谢谢
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)