私の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