regex для соответствия отдельному символу, который является совсем не пространством

При связывании с общими библиотеками убедитесь, что используемые символы не скрыты.

Стандартное поведение gcc - все символы видимы. Однако, когда единицы перевода построены с опцией -fvisibility=hidden, только функции / символы, отмеченные __attribute__ ((visibility ("default"))), являются внешними в результирующем общем объекте.

Вы можете проверить, являются ли символы, которые вы ищете, внешними, вызвав:

# -D shows (global) dynamic symbols that can be used from the outside of XXX.so
nm -D XXX.so | grep MY_SYMBOL 

скрытые / локальные символы показаны как nm с типом символов в нижнем регистре, например t вместо `T для секции кода:

nm XXX.so
00000000000005a7 t HIDDEN_SYMBOL
00000000000005f8 T VISIBLE_SYMBOL

Вы также можете использовать nm с опцией -C для разборки имен (если использовался C ++).

Подобно Windows-DLL, можно было бы пометить публичные функции определением, например DLL_PUBLIC, определенным как:

#define DLL_PUBLIC __attribute__ ((visibility ("default")))

DLL_PUBLIC int my_public_function(){
  ...
}

, что примерно соответствует версии Windows / MSVC:

#ifdef BUILDING_DLL
    #define DLL_PUBLIC __declspec(dllexport) 
#else
    #define DLL_PUBLIC __declspec(dllimport) 
#endif

Больше информации о видимости можно найти в gcc wiki.


Когда модуль перевода скомпилирован с -fvisibility=hidden, результирующие символы все еще имеют внешнюю связь (показана с символом верхнего регистра в виде nm) и могут без проблем использоваться для внешней связи, если объектные файлы становятся частью статических библиотек. Связь становится локальной, только когда объектные файлы связаны в общей библиотеке.

Чтобы найти, какие символы в объектном файле скрыты, выполните:

>>> objdump -t XXXX.o | grep hidden
0000000000000000 g     F .text  000000000000000b .hidden HIDDEN_SYMBOL1
000000000000000b g     F .text  000000000000000b .hidden HIDDEN_SYMBOL2

158
задан Jonathan Leffler 25 July 2009 в 05:37
поделиться

2 ответа

Следующего должно быть достаточно:

[^ ]

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

[^\s]

или

\S
226
ответ дан 23 November 2019 в 21:39
поделиться
  • \ s соответствует любому символу пробела
  • \ S соответствует любому символу, не являющемуся пробелом
  • Вы можете сопоставить символ пробела, используя только пробел персонаж;
  • [^] соответствует чему угодно, кроме символа пробела.

Выберите наиболее подходящий.

110
ответ дан 23 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: