2012-06-07 4 views
4

Я знаю, что когда вы скомпилировать и скомпоновать программу C, связать его с библиотекойИспользование библиотеки C из программы, отличной от C: необходимо ли явно инициализировать библиотеку C «под капотом»?

  1. C
  2. C код запуска среды выполнения

Интересно, если я пишу программу (в новом язык или просто C без ссылки на этот код) и напрямую связать его с общей библиотекой кода C (например, zlib или gsl или fftw или что-то еще) и опустить библиотеку C и код запуска C (если моя программа загрузит сам внешний lib используя свою магию), будет ли это «просто работать»?

Я знаю, что в запуске CRT есть некоторый код инициализации, поэтому я задаюсь вопросом, как я могу вызвать требуемые функции, не зависнув от моего приложения от библиотеки C: поэтому загрузка внешней библиотеки C в этот момент вызовет необходимый код инициализации (если таковой имеется, это вопрос), и в противном случае просто загружать библиотеки/интерфейсы ОС.

Причина, по которой я спрашиваю, это то, что я хочу написать язык со стандартной библиотекой, которая напрямую связана с API-интерфейсом ОС, в отличие от большинства реализаций на C++, которые построены поверх библиотеки C.

ответ

1

Посмотрите здесь https://blogs.oracle.com/ksplice/entry/hello_from_a_libc_free
Таким образом, вы можете запуска вашей программы без зависеть от любой библиотеки включены Libc, то библиотеки могут загружать и использовать по мере необходимости позже.

1

Я использовал совместно используемые библиотеки C на нескольких других языках. Нужно ли явно инициализировать общую библиотеку, зависит от библиотеки. Обычно он неявно инициализируется при загрузке, но некоторые библиотеки требуют дополнительной инициализации. Прочтите документацию.

И, конечно, должен быть инициализирован код моей программы (C или другой язык), но это то, о чем обычно заботится компилятор/компоновщик, путем ссылки на код запуска по умолчанию.

+0

Как этот «код моей программы» должен быть инициализирован точно? –

+0

Обычная инициализация вашей библиотеки времени выполнения будет рассмотрена компилятором/компоновщиком. Инициализация вашего собственного кода, конечно же, является вашей ответственностью и может, например, выполняться в основной() процедуре или в функции, вызванной основной() процедурой. –