GCC зависимость зависимость - PullRequest
0 голосов
/ 10 мая 2018

Я совершенно новичок в C и хотел использовать SDL2, поэтому я скачал их библиотеку с их сайта (используя chrome) и поместил ее в /Library/Framework (используя finder, я в OS X).

В этот момент все работало, но потом я обнаружил, что мне нужны некоторые функции из SDL_gfx, единственный способ, который я мог выяснить, это установить с помощью brew (brew install sdl_gfx). Но тогда также устанавливается еще одна копия SDL, и я получаю эту ошибку:

objc[27030]: Class SDLTranslatorResponder is implemented in both 
/usr/local/opt/sdl/lib/libSDL-1.2.0.dylib (0x1076e9680) and 
/Library/Frameworks/SDL2.framework/Versions/A/SDL2 (0x10762e748). One 
of the two will be used. Which one is undefined.

Затем я перешел к /Library/Frameworks и удалил версию SDL, которую я изначально поместил туда вручную (снова с помощью поиска, файл назывался «SDL2.framework»), но теперь я получаю эту ошибку:

dyld: Library not loaded: @rpath/SDL2.framework/Versions/A/SDL2
  Referenced from: /c_gui/./circuit
  Reason: image not found

Я погуглил и не могу понять, почему gcc делает это. Наверное, не важно, но я собираю с:

gcc -g -framework Cocoa -lSDL_gfx -lSDLmain -lSDL -o circuit circuit.c

Попытка получить этот пример кода для компиляции

Попытка скомпилировать с -v показывает, что следующие пути автоматически включаются. Я проверил, и SDL sdl.h не выглядит ни в одном из них:

  • / usr / local / include
  • / Applications / Xcode.app / Содержание / Разработчик / Наборы инструментов / XcodeDefault.xctoolchain / usr / lib / clang / 9.1.0 / include

  • / Applications / Xcode.app / Содержание / Разработчик / Наборы инструментов / XcodeDefault.xctoolchain / usr / include

  • / usr / include / System / Library / Frameworks (каталог фреймворков)
  • / Библиотека / Каркасы (каталог рамок)

1 Ответ

0 голосов
/ 10 мая 2018

Подробнее о Вызов GCC .Обратите внимание, что -framework не является опцией, известной gcc (как опубликовано FSF).Вы можете попробовать gcc --help, чтобы получить опции, понятные вашим gcc, и вы также можете передать -v, чтобы получить помощь от подпрограмм, используемых gcc.Возможно, ваша gcc команда на самом деле является неким Clang компилятором (IIRC, это может иметь место в системах Apple).

Возможно, вы захотите связать некоторую библиотеку .Так что читайте о опциях ссылки .

Порядок аргументов gcc очень важен и может зависеть от системы.Обычно исходные файлы должны идти перед объектными файлами и библиотеками (их порядок важен, от высокоуровневых до низкоуровневых).См. Также this .

Возможно, вы захотите (я не уверен в порядке библиотек):

gcc -g -Wall -Wextra circuit.c -lSDL_gfx -lSDLmain -lSDL -o circuit 

, и вам может потребоваться добавить другие параметры, особенноодин или несколько -I include-dir и соответствующие -L lib-dir flags;Точные параметры для добавления зависят от того, как вы установили свою библиотеку SDL (возможно, смотрите this ), которую вы, возможно, установили неправильно или странно.

Вы также можете передать -v, чтобы понять, какие программы работает драйвер gcc, и -H, чтобы понять, какие файлы заголовков включены.

Точный список параметров gcc может бытьспецифичная для системы.Иногда вы можете использовать pkg-config .И вы часто хотите запускать gcc команды компиляции, используя какой-то инструмент автоматизации сборки , например, GNU makeMakefile) или ninja

Изучите также для вдохновения исходный код существующего свободного программного обеспечения , связанного с вашим (например, на github ).

Кстати, если вы полностью новичок в C и вы хотите изучить программирование на C, вы можете сначала начать писать простые программы командной строки, которые зависят только от стандартной библиотеки C (поэтому не используйте SDL).Вам нужно будет научиться использовать gdb отладчик .


Я скачал их библиотеку с их сайта и поместил в / Library / Framework (IЯ на OS X).

Это очень вероятно неправильно или не полностью.Вы должны дать намного больше подробностей.

Я проверил, и SDL sdl.h не выглядит ни в одном из ...

Это может означать, чтопакет разработки SDL (заголовочные файлы, включая sdl.h) недоступен (отсутствует или был неправильно установлен).

Кстати, в большинстве дистрибутивов Linux следует установить оба пакета разработки (например, libsdl2-devи т.д. в Debian) и библиотеки времени выполнения (например, libsdl2-2.0-0 и т. д.).Это может быть то же самое с brew.См это .

...