Общие библиотеки и файлы .h

Я всегда использую нечто похожее на это:

Uses
   StrUtils, Classes;

Var
  Str, Delimiter : String;
begin
  // Str is the input string, Delimiter is the delimiter
  With TStringList.Create Do
  try
    Text := ReplaceText(S,Delim,#13#10);

    // From here on and until "finally", your desired result strings are
    // in strings[0].. strings[Count-1)

  finally
    Free; //Clean everything up, and liberate your memory ;-)
  end;

end;
13
задан nick2k3 24 July 2009 в 08:36
поделиться

4 ответа

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

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

Когда вы выполняете gcc -c program.c , вы компилируете и генерируете program.o . На этом шаге важны заголовки . Вам необходимо #include в program.c , чтобы (например) использовать malloc и free . (Точно так же вам потребуется #include для dlopen и dlsym .) Если вы этого не сделаете, компилятор будет жаловаться на то, что он не работает » не знаю, что это за имена, и останавливаюсь с ошибкой. Но если вы сделаете #include заголовок, компилятор , а не вставит код для функции, которую вы вызываете, в program.o . Он просто вставляет к ним ссылку . Причина в том, чтобы избежать дублирования кода: к коду нужно будет получить доступ только один раз для каждой части вашей программы, поэтому, если вам понадобятся дополнительные файлы ( module1.c , module2.c и так далее), даже если бы они все использовали malloc , вы бы просто получили множество ссылок на одну копию malloc . Эта единственная копия присутствует в стандартной библиотеке либо в общей, либо в статической форме ( libc.so или libc.a ), но они не упоминаются в вашем источник, а компилятор не знает о них.

Компоновщик - . На этапе компоновки вы выполняете gcc -o program program.o . Затем компоновщик выполнит поиск во всех библиотеках, которые вы передаете ему в командной строке, и найдет единственное определение всех функций, которые вы вызвали, которые не определены в вашем собственном коде. Это то, что делает -l (как объяснили другие): сообщает компоновщику список библиотек, которые вам нужно использовать. Их имена часто имеют мало общего с заголовками, которые вы использовали на предыдущем шаге. Например, чтобы использовать dlsym , вам понадобится libdl.so или libdl.a , поэтому ваша командная строка будет gcc -o program program .o -ldl . Чтобы использовать malloc или большинство функций в заголовках std * .h , вам понадобится libc , но поскольку эта библиотека используется каждые ] Программа на C автоматически связана (как если бы вы сделали -lc ).

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

И последнее: dlopen и dlsym не являются обычным методом компоновки. Они используются в особых случаях, когда вы хотите динамически определять, какое поведение вы хотите, на основе информации, которая по какой-либо причине доступна только во время выполнения. Если вы знаете, какие функции хотите вызывать во время компиляции (верно в 99% случаев), вам не нужно использовать функции dl * .

49
ответ дан 1 December 2019 в 17:29
поделиться

Вы можете связывать разделяемые библиотеки как статические. Затем они ищутся при запуске программы. Фактически, по умолчанию -lXXX предпочтет libXXX.so вместо libXXX.a.

3
ответ дан 1 December 2019 в 17:29
поделиться

Вам необходимо дать компоновщику правильные инструкции для компоновки вашей разделяемой библиотеки.

Имена разделяемых библиотек похожи на libNAME.so, поэтому для компоновки вы должны использовать -lNAME

Call это libmysharedlib.so, а затем свяжите свою основную программу следующим образом:

gcc -o myprogram myprogram.c -lmysharedlib 
2
ответ дан 1 December 2019 в 17:29
поделиться

Если вы используете CMake для сборки вашего проекта, вы можете использовать

TARGET_LINK_LIBRARIES(targetname libraryname)

Как в:

TARGET_LINK_LIBRARIES(myprogram mylibrary)

Для создания библиотеки «mylibrary» вы можете использовать

ADD_LIBRARY(targetname sourceslist)

Как в:

ADD_LIBRARY(mylibrary ${mylibrary_SRCS})

Кроме того, этот метод является кроссплатформенным (тогда как простая передача флагов в gcc - нет).

1
ответ дан 1 December 2019 в 17:29
поделиться