GCC, связывающий библиотеки, не найден?

  • ОС: Windows 7 Pro X64
  • IDE: Eclipse IDE для разработчиков на C/C++
  • Компилятор: MinGW (последний, 4.5.2)

Компиляция HelloWorld.c работает; но когда я пытаюсь добавить некоторые внешние библиотеки, он задыхается.

Я добавил файлы.a и.dll в мои "Библиотеки"; добавьте путь к PATH и пути к библиотеке. Я также положил включаемые файлы и настроил Включить. Говорят, что мои библиотеки совместимы с win / mingw. У них также есть другая загрузка для MSVC, которая действительно работает.

Разочарование. Ld.exe дает полный путь и, очевидно, у меня есть права на чтение / запись. Я также включил их без пути (они находятся в пути библиотеки и пути).

Я не понимаю, почему это не работает.

c: / mingw / bin /../ lib / gcc / mingw32 / 4.5.2 /../../../../ mingw32 / bin / ld.exe: не удается найти -lC:\rhino\data\lib\glfw.dll c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: не удается найти -lC:\rhino\data\lib\libglfwdll.a c:/mingw/bin/../lib/gcc/mingw32/4.5.2/../../../../mingw32/bin/ld.exe: невозможно find -lC:\rhino\data\lib\libglfw.a

C:\Users\rhino>dir C:\rhino\data\lib\libglfw.a
04/15/2011  05:24 PM            70,384 libglfw.a

Обновлено:

Я даже добавил их в мой путь C:\MinGW\lib, но он все еще не может их найти.

4 ответа

Решение

Майкл Барр указал правильный способ ссылки на библиотеки в командной строке. Путь к библиотеке указывается с -L и имя библиотеки с -l переключатель (имя библиотеки, являющейся именем файла, без lib часть в начале, а .a суффикс в конце).

Еще одна вещь, на которую следует обратить внимание, это то, что вы пытаетесь связать как статическую (libglfw.a), так и динамическую (glfw.dll) версию библиотеки, которые оба включены в загрузку, одновременно. Вместо этого вы должны выбрать один, основываясь на ваших потребностях / желаниях, и только ссылку на него.

Связать со статической версией просто. Просто добавь -lglfw в командной строке.

Чтобы использовать динамическую библиотеку, вы должны сделать ссылку на библиотеку импорта для библиотеки DLL (libglfwdll.a), используя -lglfwdll и пропустите саму dll из команды link. По сути, библиотека импорта не содержит никакого объектного кода, а содержит только определения; Фактический код находится в DLL. DLL будет динамически связан во время выполнения. (Чтобы это работало, система должна быть в состоянии найти dll; то есть она должна находиться в текущем рабочем каталоге, в каталоге, который находится в пути, или ее каталог должен быть добавлен в специальную переменную среды, используемую для этого, но для того, чтобы это стало важным, сначала вы должны преуспеть в создании исполняемого файла.)

Мой опыт (который не включает, как это может быть настроено в Eclipse) заключается в том, что ld (который вызовет gcc) хочет получить имена библиотек без lib префикс или .a расширение. Пытаться:

gcc -LC:\rhino\data\libs -LC:\rhino\data\lib -oTestC.exe TestC.o -lglfw -lglfwdll

Я не уверен, что glfw.dll файл должен быть указан как библиотека; библиотека импорта для этой DLL (я полагаю, это libglfwdll.lib) должна позаботиться о связывании с DLL.

Попробуй это:

gcc -LC:\rhino\data\libs -LC:\rhino\data\lib -oTestC.exe TestC.o -lglfw libglfw.a libglfwdll.a

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

В моем случае из-за порядка $PATH оболочки ( echo $PATH), gcc использовался из установки anaconda, и это ld не удалось найти конкретную библиотеку.

Простое изменение порядка путей решило эту проблему:

      export PATH=/usr/bin:$PATH

Вредных эффектов нет, смотрите здесь .

Другие вопросы по тегам