在我的 Debian 9 系统上,我使用 Code::Blocks IDE 来编译和链接我的 gtk+3.0 应用程序。但更新到最新的 Debian 10 后,链接器无法正确链接到 gtk+3.0。
以下是我的 Code::Blocsk IDE 中的命令行宏:
- 将单个文件编译为目标文件:
$compiler $options $includes -c $file -o $object
- 将目标文件链接到控制台可执行文件:
$linker $libdirs -o $exe_output $link_objects $link_resobjects $link_options $libs
这是编译器创建目标文件的方式:
g++ -Wall -std=c++11 -g -fPIC -c /home/pekov/Workshop/CodeBlocks/UniPhy_dev/math_module/coordinateTransform.cpp -o obj/Debug/coordinateTransform.o
这是链接器失败的尝试(标志之后-rdynamic
是我自己的编译良好的库):
g++ -o bin/Debug/tester obj/Debug/main.o -static-libgcc -lboost_iostreams -lboost_system -lboost_filesystem -lboost_serialization -lcomplex_bessel -larmadillo -lprocps -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -rdynamic ../math_module/bin/Debug/libmath_module.so ../poroelasticity_module/bin/Debug/libporoelasticity_module.a ../shared_library/bin/Debug/libshared_library.so ../BEM-FEM_library/bin/Debug/libBEM-FEM_library.so ../BEM_module/bin/Debug/libBEM_module.a ../elasticity_module/bin/Debug/libelasticity_module.a ../CAD_module/bin/Debug/libCAD_module.a ../GUI_module/bin/Debug/libGUI_module.a ../expression_parser/bin/Debug/libparser.a
链接器消息位于第一个遇到的gtk+3.0函数中:
undefined reference to 'gtk_widget_get_type'
我尝试从链接器中提取更多信息,但除了上面的消息之外找不到其他任何信息。
系统升级后,gcc 编译器也升级了,我认为这可能是问题所在,但降级 gcc 绝对不是个好主意。我尝试使用 kali linux (滚动版本),但输出是相同的。
所以我找到了一个解决方案(从这里)通过将编译器从 gcc-9 更改为 gcc-7:
sudo apt-get install gcc-7 g++-7 g++-7-multilib gfortran-7
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 60 --slave /usr/bin/g++ g++ /usr/bin/g++-7 --slave /usr/bin/gfortran gfortran /usr/bin/gfortran-7
sudo update-alternatives --config gcc
现在它工作正常,但我希望它能与最新的 gcc-9 一起工作!
答案1
我不知道中的变量$linker $libdirs -o $exe_output $link_objects $link_resobjects $link_options $libs
对应什么,但这里的问题是链接器现在按照遇到的顺序跟踪未定义的对象,并且仅解析之前丢失的对象。这意味着需要指定库后需要其符号的对象:在您的示例中-lboost_iostreams ... -lglib-2.0
需要位于后面。libparser.a