Я всегда использую нечто похожее на это:
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;
Ник, я думаю, что все остальные ответы на самом деле отвечают на ваш вопрос о том, как вы связываете библиотеки, но то, как вы формулируете свой вопрос, предполагает, что вы неправильно понимаете разницу между файлами заголовков и библиотеки. Они не одинаковы. Вам нужны и , и они не делают одно и то же.
Сборка исполняемого файла состоит из двух основных этапов: компиляции (которая превращает ваш исходный код в промежуточную форму, содержащую исполняемые двоичные инструкции, но не является исполняемая программа) и компоновка (которая объединяет эти промежуточные файлы в один исполняемый файл или библиотеку).
Когда вы выполняете 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 *
.
Вы можете связывать разделяемые библиотеки как статические. Затем они ищутся при запуске программы. Фактически, по умолчанию -lXXX предпочтет libXXX.so вместо libXXX.a.
Вам необходимо дать компоновщику правильные инструкции для компоновки вашей разделяемой библиотеки.
Имена разделяемых библиотек похожи на libNAME.so, поэтому для компоновки вы должны использовать -lNAME
Call это libmysharedlib.so, а затем свяжите свою основную программу следующим образом:
gcc -o myprogram myprogram.c -lmysharedlib
Если вы используете CMake для сборки вашего проекта, вы можете использовать
TARGET_LINK_LIBRARIES(targetname libraryname)
Как в:
TARGET_LINK_LIBRARIES(myprogram mylibrary)
Для создания библиотеки «mylibrary» вы можете использовать
ADD_LIBRARY(targetname sourceslist)
Как в:
ADD_LIBRARY(mylibrary ${mylibrary_SRCS})
Кроме того, этот метод является кроссплатформенным (тогда как простая передача флагов в gcc - нет).