GCC 컴파일러는 업데이트 후 gtk+3.0에 연결할 수 없습니다.

GCC 컴파일러는 업데이트 후 gtk+3.0에 연결할 수 없습니다.

내 Debian 9 시스템에서는 Code::Blocks IDE를 사용하여 gtk+3.0 애플리케이션을 컴파일하고 링크합니다. 그러나 최신 Debian 10으로 업데이트한 후 링커는 gtk+3.0에 올바르게 링크할 수 없습니다.

내 Code::Blocsk IDE의 명령줄 매크로는 다음과 같습니다.

  1. 단일 파일을 객체 파일로 컴파일합니다.$compiler $options $includes -c $file -o $object
  2. 개체 파일을 콘솔 실행 파일에 연결합니다.$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로 변경하여:

  1. sudo apt-get install gcc-7 g++-7 g++-7-multilib gfortran-7
  2. 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
  3. 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

관련 정보