2017-02-13 3 views
-4

Когда я компилирую проект SDL на C++, он создает для меня исполняемый файл. Когда я запускаю этот исполняемый файл, он не работает, если у меня нет SDL.dll в том же каталоге. Я понимаю, потому что ему нужно найти все библиотеки и API, которые используются.Включает ли компилятор компиляции?

Но когда я создаю свою собственную библиотеку и включаю ее в код, почему она не должна находиться в том же каталоге? Почему он может быть полностью удален, и исполняемый файл все равно будет работать? В чем разница между моей собственной библиотекой и SDL в примере?

+2

ли вы собираете свою собственную библиотеку как статические LIB? – tkausl

+0

Я имел в виду мои собственные файлы заголовков и cpp. –

ответ

1

Да, компилятор компиляции является единицей перевода или единицей компиляции. Сюда входят заголовки для каждого файла cpp.

Затем у вас есть компоновщик. Это связывает ваш скомпилированный код в полезной форме.

Возможно, файлы .dlls найдены и включены в приложение при запуске приложения.

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

(Потому что детали, которые вы давали немного неясно - это может быть или не быть вся история)

0

Im не эксперт, но я думаю, что эта информация может быть полезной

компиляции зависит от составитель используется, но обычно это занимает 4 шага, это является примером GCC:

  • предварительной обработки
  • компиляции
  • осла embly
  • связь

В первом шаге составитель заменяет включает в себя генерирование .i файл, этот файл имеет включены заголовки, но не реализации тех.

На этапе компиляции процесс обрабатывает .i-файл и выводит файл .s, этот файл содержит программу, переведенную на сборку, пока не реализована.

На третьем этапе, .с файл переводится в машинный код, генерируя .obj двоичный файл (обычно в формате ELF, так как a.out устарело, расширение файлов, просто Heritance)

В четвёртом step. Все файлы .obj связаны с другими .obj и статическими библиотеками, здесь код всех из них сливается в окончательный исполняемый файл.

Если после соединения и работы есть функция, которая не была реализована, но на этапе компоновки была объявлена ​​опция dynlib, программа будет искать ее на главной машине, это то, что происходит с вами с помощью SDL.

У вас есть 2 возможных исправления.

  • (правильный) корабль SDL2.dll с вашим двоичным кодом и установить его в процессе установки.

  • (как-то не так) строить SDL как статические OBJ и связать его с двоичным построения автономного исполняемого

удачи;)

Смежные вопросы