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

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

Я пытаюсь использовать FTGL, чтобы иметь возможность использовать текст в OpenGL. FTGL требует, чтобы FreeType 2 был установлен. Я загрузил исходный код FreeType и следовал инструкциям INSTALL.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, но у меня нет большого опыта с этим, и инструкция в INSTALL.UNIX предполагает, что вы знаете более очевидные команды. Они упоминают использование ./configure [options], без упоминания того, какие параметры могут быть полезны. Вероятно, очевидно для кого-то с большим знанием системы, но MSys - мой первый опыт с sh.

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

1 Ответ

1 голос
/ 16 июля 2011

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

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

...