Основы компилируемых языков - PullRequest
2 голосов
/ 14 сентября 2009

пожалуйста, кто-нибудь может объяснить мне несколько основных вещей о работе с такими языками, как C? Особенно на Windows?

  1. Если я хочу использовать какую-то другую библиотеку, что мне нужно из библиотеки? Заголовочные файлы .h и ..?

  2. В чем разница между .dll и .dll.a.? .dll и .lib? .dll и .exe? Что такое .def?

  3. Имеет ли значение, как была скомпилирована библиотека? Я имею в виду, возможно ли использовать в Windows библиотеку C ++, скомпилированную VC из моего кода C, скомпилированного MinGW?

  4. Для использования другой библиотеки, какой способ предпочтительнее? LoadLibrary () или #include <>?

  5. Есть некоторые библиотеки, которые предоставляют только исходный код или .dll - как использовать такие библиотеки? Нужно ли перекомпилировать их каждый раз, когда я перестраиваю свой проект?

  6. Как мне создать один большой .exe? Это называется "статическое связывание"?

  7. Как включить какой-нибудь случайный файл в .exe? Скажите значок программы или стартовую песню?

  8. Как мне разбить мой огромный .c на более мелкие? Нужно ли создавать для каждой части файл заголовка, который затем включается в часть с помощью WinMain () или main ()?

  9. Если есть библиотека, которая нуждается в другой библиотеке, возможно ли объединить эти две в один файл? Скажем, python26.dll требует msvcr90.dll и Microsoft.VC90.CRT.manifest

  10. Что произойдет, если я не освободлю ранее выделенную память? Это будет очищено, если программа (процесс) умирает?

Ну, так много вопросов ... Спасибо за каждую информацию!

Ответы [ 3 ]

3 голосов
/ 14 сентября 2009

1: Если я хочу использовать какую-то другую библиотеку, что мне нужно из библиотеки? Заголовочные файлы .h и ..?

... и, как правило, *.lib файл, который вы передаете в качестве аргумента вашему компоновщику.

2: В чем разница между .dll и .dll.a.? .dll и .lib? .dll и .exe? Что такое .def?

Это может быть полезно: Статические библиотеки, динамические библиотеки, библиотеки DLL, точки входа, заголовки ... как выбраться из этого живым?

3: Имеет ли значение, как была скомпилирована библиотека? Я имею в виду, возможно ли использовать в Windows библиотеку C ++, скомпилированную VC из моего кода C, скомпилированного MinGW?

Да, это важно. Для взаимодействия между компиляторами обычным способом является использование API в стиле C (не в стиле C ++) с четко определенными соглашениями о передаче параметров (например, __stdcall) или использование интерфейсов 'COM'.

4: Какой другой способ использовать другую библиотеку? LoadLibrary () или #include <>?

#include для компилятора (например, чтобы он мог компилировать вызовы в библиотеку); и LoadLibrary (или, используя файл *.lib) - для компоновщика / загрузчика времени выполнения (так что он может подставить фактический адрес этих библиотечных методов в ваш код): то есть вам нужны оба.

5: Есть некоторые библиотеки, которые предоставляют только исходный код или .dll - как использовать такие библиотеки? Нужно ли перекомпилировать их каждый раз, когда я перестраиваю свой проект?

Если это только источник, вы можете скомпилировать этот источник (один раз) в библиотеку, а затем (при создании проекта) связать эту библиотеку (без перекомпиляции библиотеки).

6: Как мне создать один большой .exe? Это называется "статическое связывание"?

Да, скомпилируйте все и передайте компоновщику.

7: Как включить какой-нибудь случайный файл в .exe? Скажите значок программы или стартовую песню?

Определите это в специфичном для Windows «файле ресурсов», который компилируется «компилятором ресурсов».

8: Как мне разбить мой огромный .c на более мелкие? Нужно ли создавать для каждой части файл заголовка, который затем включается в часть с помощью WinMain () или main ()?

Да.

9: Если есть библиотека, которая нуждается в другой библиотеке, возможно ли объединить эти две в один файл? Скажем, python26.dll требует msvcr90.dll и Microsoft.VC90.CRT.manifest

Я не понимаю ваш вопрос / пример.

10: Что произойдет, если я не освободлю ранее выделенную память? Это будет очищено, если программа (процесс) умирает?

Да.

1 голос
/ 14 сентября 2009

Если я хочу использовать какую-то другую библиотеку, что мне нужно из библиотеки? Заголовочные файлы .h и ..?

Вам нужен заголовок .h или .hpp для C, C ++, хотя некоторые языки не требуют заголовочных файлов. Вам также понадобятся файлы .a, .so, .dll, .lib, .jar и т. Д. Эти файлы содержат машинный код, который компоновщик может связать с вашей программой. Само собой разумеется, что формат библиотеки должен понимать ваш компоновщик.

В чем разница между .dll и .dll.a.? .dll и .lib? .dll и .exe? Что такое .def?

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

Имеет ли значение, как была скомпилирована библиотека? Я имею в виду, возможно ли использовать в Windows библиотеку C ++, скомпилированную VC из моего кода C, скомпилированного MinGW?

Да, важно, чтобы используемая библиотека была совместима с вашей платформой. Обычно библиотеки Unix не работают в Windows, и наоборот, если вы используете JAVA, вам лучше, поскольку файлы .jar обычно работают на любой платформе с включенной JAVA (хотя версии имеют значение)

Какой другой способ выбрать для использования другой библиотеки? LoadLibrary () или #include <>?

include - это не способ использовать библиотеку, это просто директива препроцессора, сообщающая препроцессору о включении внешнего исходного файла в ваш текущий исходный файл. Этот файл может быть любым файлом, а не только .h, хотя обычно это будет .h или .hpp Вам будет лучше, если я оставлю решение о том, когда загружать библиотеку в среду выполнения или в ваш компоновщик, если вы точно не знаете, что загрузка библиотеки в определенный момент времени добавит некоторую ценность вашему коду. Стоимость производительности и точный способ сделать это зависят от платформы.

Есть некоторые библиотеки, которые предоставляют только исходный код или .dll - как использовать такие библиотеки? Нужно ли перекомпилировать их каждый раз, когда я перестраиваю свой проект?

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

Как мне создать один большой .exe? Это называется "статическое связывание"?

Создание статического .exe зависит от используемого вами инструмента сборки. с gcc это обычно означает, что у вас есть опция -static gcc -static -o my.exe my.c

Как включить какой-нибудь случайный файл в .exe? Скажите значок программы или стартовую песню?

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

Как мне разбить мой огромный .c на более мелкие? Нужно ли создавать для каждой части файл заголовка, который затем включается в часть с помощью WinMain () или main ()?

Вам понадобится заголовочный файл со всеми вашими прототипами функций, и вы можете разбить вашу программу на несколько файлов .c, которые содержат одну или несколько функций. Ваши основные файлы будут включать заголовочный файл. Все исходные файлы должны быть скомпилированы индивидуально, а затем связаны в один исполняемый файл. Обычно вы получаете .o для каждого .c, а затем связываете все .o вместе, чтобы получить .exe

Если есть библиотека, которая нуждается в другой библиотеке, возможно ли объединить эти две в один файл? Скажем, python26.dll требует msvcr90.dll и Microsoft.VC90.CRT.manifest

Да, для одной библиотеки может потребоваться другая библиотека, однако не рекомендуется объединять разные библиотеки вместе, возможно, вы нарушаете ПИС, а также то, что каждая библиотека обычно представляет собой единое целое с определенной целью и объединяет их в одну не имеет особого смысла.

Что произойдет, если я не освободлю ранее выделенную память? Это будет очищено, если программа (процесс) умирает?

Опять же, зависит от платформы, обычно на большинстве ОС память восстанавливается после смерти программы, но на некоторых платформах, таких как встроенная система, она может быть потеряна навсегда. Это всегда хорошая идея, чтобы очистить ресурсы, которые использовала ваша программа.

0 голосов
/ 14 сентября 2009

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

Но вот несколько ответов:

1. Вам нужны заголовки и какой-либо связываемый объект. Или вам нужен источник, чтобы вы могли построить их.

3. Важно, чтобы библиотека была в формате, понятном вашему компоновщику. В c ++ и, возможно, в других языках также необходимо понимать название искажения, которое использовалось.

6. Принудительное включение всего кода библиотеки в исполняемый файл действительно называется "статическим связыванием".

7. Существует как минимум один вопрос StackOverflow по "компиляторам ресурсов" .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...