wxWidgets не линкуется статически из-за множества undefined reference
Скомпилировал wxWidgets строкой mingw32-make -j8 -f makefile.gcc BUILD=debug SHARED=0 в надежде линковать библиотеки статически. В используемой Eclipse IDE сделал всё, как нужно: задефайнил __WXMSW__; прописал include и путь к библиотекам lib*.a; указал на библиотеки wxmsw32ud_core, wxbase32ud; в флагах линкера написал -static. Компиляция тестового кода падает из-за каких-то undefined reference:
Info: Internal Builder is used for build
windres.exe --use-temp-file -I "D:\C++\wxWidgets_static\include" "D:/C++/Projects/Test\resources\res.rc" "D:/C++/Projects/Test\resources\res.o"
g++ "-LD:\C++\wxWidgets_static\lib\gcc_lib" -static -o Test.exe "src\Test.o" -lwxmsw32ud_core -lwxbase32ud
(много ошибок, подобных тем, что ниже)
d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\lib\gcc_lib\libwxbase32ud.a(baselib_filename.o):filename.cpp:(.rdata$.refptr.IID_IPersistFile[.refptr.IID_IPersistFile]+0x0): undefined reference toIID_IPersistFile' d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\lib\gcc_lib\libwxbase32ud.a(baselib_filename.o):filename.cpp:(.rdata$.refptr.IID_IShellLinkW[.refptr.IID_IShellLinkW]+0x0): undefined reference toIID_IShellLinkW' d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\lib\gcc_lib\libwxbase32ud.a(baselib_dlmsw.o): in functionGetFileVersion': D:\C++\wxWidgets_static\build\msw/../../src/msw/dlmsw.cpp:64: undefined reference toGetFileVersionInfoSizeW' d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\build\msw/../../src/msw/dlmsw.cpp:68: undefined reference toGetFileVersionInfoW' d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\build\msw/../../src/msw/dlmsw.cpp:72: undefined reference toVerQueryValueW' d:/c++/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/12.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: D:\C++\wxWidgets_static\lib\gcc_lib\libwxbase32ud.a(baselib_utils.o): in functionwxCmpNatural(wxString const&, wxString const&)': D:\C++\wxWidgets_static\build\msw/../../src/msw/utils.cpp:1692: undefined reference to__imp_StrCmpLogicalW'
Интернет ничем не помог.
Ответы (1 шт):
Самому угадывать флаги для компиляции библиотеки - это уж совсем каменный век.
Большинство нормальных библиотек позволяют автоматически определять нужные флаги - обычно через pkg-config, но у wxWidgets свой костыльный wx-config.
Запускать его (а также ставить сам wxWidgets и компилятор) удобно из MSYS2.
Сносите свой MinGW и wxWidgets, или хотя бы убираете MinGW из PATH, чтобы не мешался.
Ставите MSYS2 отсюда.
Запускаете ярлыком
MSYS2 UCRT64. Если сделано правильно, в терминале будет написаноUCRT64фиолетовыми буквами.Обновляетесь командой
pacman -Syuu. Если консоль закроется - открыть и повторить команду еще раз для завершения обновления.Ставите себе GCC, GDB, и wxWidgets:
pacman -S mingw-w64-ucrt-x86_64-gcc mingw-w64-ucrt-x86_64-gdb mingw-w64-ucrt-x86_64-wxwidgets3.2-mswПробуете скомпилировать тестовую программу. Я взял код отсюда и компилировал командой:
g++ my_code.cpp -static `wx-config --cflags --libs --static`Обратите внимание на обратные кавычки, они запускают команду
wx-configи подставляют ее вывод во флагиg++.Теперь можно настоить Eclipse, чтобы он делал то же самое. Меняете там путь до компилятора на
C:\msys64\ucrt64\bin, во флаги компилятора пишете выводwx-config --cflags, а во флаги линковщика-staticи выводwx-config --libs --static.