Обычно каждая единица перевода генерирует объектный файл, содержащий определения символов, определенных в этой единицы перевода. Чтобы использовать эти символы, вам необходимо связать эти объектные файлы.
В разделе gcc вы должны указать все объектные файлы, которые должны быть связаны вместе в командной строке, или скомпилировать файлы реализации вместе.
g++ -o test objectFile1.o objectFile2.o -lLibraryName
Здесь libraryName
- это просто имя библиотеки, без добавления к платформе. Так, например, в файлах библиотеки Linux обычно называют libfoo.so
, но вы должны писать только -lfoo
. В Windows этот же файл можно назвать foo.lib
, но вы будете использовать тот же аргумент. Возможно, вам придется добавить каталог, в котором эти файлы можно найти, используя -L‹directory›
. Обязательно не записывайте пробел после -l
или -L
.
Для XCode: добавьте пути поиска заголовка пользователя -> добавьте путь поиска библиотеки -> перетащите фактическую ссылку библиотеки в
В MSVS файлы, добавленные в проект, автоматически связывают их объектные файлы, и будет создан файл lib
(в общем использовании). Чтобы использовать символы в отдельном проекте, вам нужно будет добавить файлы lib
в параметры проекта. Это делается в разделе Linker свойств проекта в Input -> Additional Dependencies
. (путь к файлу lib
должен быть добавлен в Linker -> General -> Additional Library Directories
). При использовании сторонней библиотеки, которая предоставляется с файлом lib
, отказ в этом обычно приводит к ошибке.
Также может случиться так, что вы забудете добавить файл в компиляцию, и в этом случае объектный файл не будет сгенерирован. В gcc вы должны добавить файлы в командную строку. В MSVS добавление файла в проект заставит его скомпилировать его автоматически (хотя файлы могут, вручную, быть отдельно исключены из сборки).
В программировании Windows контрольный знак, который вы не связывали необходимая библиотека состоит в том, что имя неразрешенного символа начинается с __imp_
. Посмотрите имя функции в документации, и она должна сказать, какую библиотеку вам нужно использовать. Например, MSDN помещает информацию в поле внизу каждой функции в разделе «Библиотека».
Не знаю, как это сделать в базе, но вот пакет для ваших нужд:
library(stringr)
str_match_all(s, r)
#[[1]]
# [,1] [,2]
#[1,] "xy1234" "1234"
#[2,] "xy567" "567"
Многие функции stringr
также имеют параллели в базе R, поэтому вы также можете достичь этого, не используя stringr
.
Например, вот упрощенная версия того, как это работает, используя базу R:
sapply(regmatches(s,gregexpr(r,s))[[1]], function(m) regmatches(m,regexec(r,m)))
strapplyc
в пакете gsubfn делает следующее:
> library(gsubfn)
>
> strapplyc(s, r)
[[1]]
[1] "1234" "567"
Попробуйте ?strapplyc
для получения дополнительной информации и примеров.
Связанные функции
1) Обобщение strapplyc
есть strapply
в одном пакете. Он принимает функцию, которая вводит захваченные части каждого совпадения и возвращает выход функции. Когда функция c
, она уменьшается до strapplyc
. Например, предположим, что мы хотим вернуть результаты как числовые:
> strapply(s, r, as.numeric)
[[1]]
[1] 1234 567
2) gsubfn
является другой связанной функцией в том же пакете. Это похоже на gsub
, за исключением того, что строка замены может быть функцией замены (или списком замещения или заменяющим прото-объектом). Функция замены вводит захваченные части и выводит замену. Замена заменяет совпадение во входной строке. Если используется формула, как в этом примере, правая часть формулы рассматривается как тело функции. В этом примере мы заменим соответствие на XY{#}
, где # в два раза соответствует номеру ввода.
> gsubfn(r, ~ paste0("XY{", 2 * as.numeric(x), "}"), s)
[1] "XY{2468}wz98XY{1134}"
UPDATE: добавлены примеры strapply
и gsubfn
.
Для базового R-решения, как только использовать gsub()
для завершения обработки строк, извлеченных из gregexpr()
и regmatches()
?
s <- "xy1234wz98xy567"
r <- "xy(\\d+)"
gsub(r, "\\1", regmatches(s,gregexpr(r,s))[[1]])
# [1] "1234" "567"