Не удалось связать библиотеку FreeType 2 с помощью MinGW;ld.exe:не удается найти -lfreetype

StackOverflow https://stackoverflow.com/questions/6091982

Вопрос

Я компилирую с помощью MinGW в Windows 7, используя Code::Blocks в качестве IDE.Все должно быть в актуальном состоянии.Я заметил, что есть ряд похожих вопросов, но они, похоже, касались связывания динамической библиотеки, а не компиляции статической библиотеки.

Я пытаюсь использовать FTGL, чтобы иметь возможность использовать текст в OpenGL.Для FTGL требуется установить FreeType 2.Я скачал исходный код FreeType и выполнил УСТАНОВКУ.Инструкции GNU по созданию статической библиотеки из CMD.EXE, используя mingw32-make.exe.

Как указано в инструкциях, я запустил mingw32-make из базового каталога установки FreeType.Вывод на консоль был таким, как ожидалось:

D:\freetype-2.4.4>mingw32-make

FreeType build system -- automatic system detection

The following settings are used:

  platform                     win32
  compiler                     gcc
  configuration directory      .\builds\win32
  configuration rules          .\builds\win32\w32-gcc.mk

If this does not correspond to your system or settings please remove the file
'config.mk' from this directory then read the INSTALL file for help.

Otherwise, simply type 'make' again to build the library.
or 'make refdoc' to build the API reference (the latter needs python).

Could Not Find D:\freetype-2.4.4\objs\ftmodule.h
Generating modules list in ./objs/ftmodule.h...
"* module: truetype  (Windows/Mac font files with extension *.ttf or *.ttc)"
"* module: type1     (Postscript font files with extension *.pfa or *.pfb)"
"* module: cff       (OpenType fonts with extension *.otf)"
"* module: cid       (Postscript CID-keyed fonts, no known extension)"
"* module: pfr       (PFR/TrueDoc font files with extension *.pfr)"
"* module: type42    (Type 42 font files with no known extension)"
"* module: winfnt    (Windows bitmap fonts with extension *.fnt or *.fon)"
"* module: pcf       (pcf bitmap fonts)"
"* module: bdf       (bdf bitmap fonts)"
"* module: sfnt      (helper module for TrueType & OpenType formats)"
"* module: autofit   (automatic hinting module)"
"* module: pshinter  (Postscript hinter module)"
"* module: raster    (monochrome bitmap renderer)"
"* module: smooth    (anti-aliased bitmap renderer)"
"* module: smooth    (anti-aliased bitmap renderer for LCDs)"
"* module: smooth    (anti-aliased bitmap renderer for vertical LCDs)"
"* module: psaux     (Postscript Type 1 & Type 2 helper module)"
"* module: psnames   (Postscript & Unicode Glyph name handling)"
done.

Убедившись, что и платформа, и компилятор были верны, я снова запустил команду make:

D:\freetype-2.4.4>mingw32-make
(bunch of calls, building objects then linking them, until:)
ar: creating objs/freetype.a

В результате был создан файл freetype.a в каталоге D:\freetype-2.4.4\objs.

Затем я выполнил шаги из Code::Blocks, чтобы связать библиотеку с проектом, добавил пример кода для тестирования FTGL и попытался его собрать.

У меня возникают две ошибки, в зависимости от того, как я пытаюсь что-то делать.

Если я предоставлю компоновщику правильный каталог (-LD:\ freetype-2.4.4\objs) и свяжусь с -lfreetype, все будет в порядке до тех пор, пока ld.exe завершает работу с ошибкой в заголовке, не удается найти -lfreetype.

Если я не указываю правильный каталог, я получаю ту же ошибку.Не могу найти библиотеку.

Если я изменю имя файла, freetype.a, на libfreetype.a, и предоставлю правильный каталог, я вместо этого получу несколько неопределенных ссылок.

obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x250): undefined reference to `FTPixmapFont::FTPixmapFont(char const*)'
obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x258): undefined reference to `FTFont::Error() const'
obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x274): undefined reference to `FTFont::FaceSize(unsigned int, unsigned int)'
obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x308): undefined reference to `FTFont::Render(char const*, int, FTPoint, FTPoint, int)'
obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x316): undefined reference to `FTPixmapFont::~FTPixmapFont()'
obj\Release\CApp_OnRender.o:CApp_OnRender.cpp:(.text+0x328): undefined reference to `FTPixmapFont::~FTPixmapFont()'
collect2: ld returned 1 exit status

Если я укажу неправильный каталог, я снова получу предыдущую ошибку о том, что не удалось найти библиотеку.

Мне показалось странным, что make, следуя инструкциям в установочном файле, создавал библиотеку с именем, которое не начиналось с lib.Я проверил и каждый другой файл .a начинался с lib-.И похоже, что компоновщик ищет файл libfreetype.a.Так почему же make создает freetype.a вместо этого?При этом используется тот же компилятор для библиотеки, который я использую для компиляции программы.

В любом случае, не уверен, куда идти дальше.Я думал использовать оболочку MSys, которая является частью пакета MinGW, но у меня нет большого опыта работы с ней и инструкцией по УСТАНОВКЕ.UNIX предполагает, что вы знаете более очевидные команды.Они упоминают использование ./configure [options], без упоминания о том, какие параметры могут быть целесообразны.Вероятно, очевидно для кого-то, кто лучше разбирается в системе, но MSys - это мой первый опыт работы с sh.

Я был бы признателен за любую помощь в этом вопросе.

Это было полезно?

Решение

Моя версия libfreetype.a (2.4.4, созданная из модифицированного пакета debian) не экспортирует символы, которые ищет ваш компоновщик (конструктор FTPixmapFont), и заголовки не объявляют такой класс.Быстрый поиск в Google показывает, что они принадлежат FTGL.

Переименование вашего файла импорта в libfreetype.a было правильным (иначе mingw ld не найдет его), но вы также ссылались на необходимые библиотеки FTGL?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top