Можете ли вы поместить библиотеку в пространство имен? - PullRequest
6 голосов
/ 13 июля 2009

Я работаю с OpenCV и хотел бы поместить всю библиотеку в собственное пространство имен. Я немного осмотрелся, но не нашел ответа ...

Можете ли вы сделать это без изменения исходного кода библиотеки? Если тогда как?

Ответы [ 4 ]

7 голосов
/ 13 июля 2009

В основном нет. Вы можете попытаться сделать это, написав обертки и макросы, но это вряд ли сработает. Если вам действительно нужно это сделать, лучшим подходом является создание библиотеки и внесение необходимых дополнений в пространство имен. Конечно, вам ДЕЙСТВИТЕЛЬНО нужно сделать это, чтобы воспользоваться этим подходом, и я подозреваю, что вы этого не делаете.

4 голосов
/ 13 июля 2009

Общий ответ: вы не можете, но есть несколько хитростей, которые вы можете сделать.

Например, objcopy из binutils имеет возможность копировать объект, но ставить префикс для каждого символа с помощью - префикс-символов флаг. префиксы часто являются пространствами имен бедного человека и являются «нормальным» способом избежать конфликтов.

Использование довольно просто, примерно так:

objcopy --prefix-symbols "__mylib_" object.o new_object.o

ПРИМЕЧАНИЕ: да, он работает и с файлами .so.

ПРИМЕЧАНИЕ 2: это полностью нарушит искажение имени в c ++, поэтому пытайтесь делать это только в библиотеке с API в стиле C. Поскольку вы говорите о добавлении пространства имен там, где его нет, я полагаю, что это так.

4 голосов
/ 13 июля 2009

В принципе, вы можете написать программу, которая будет анализировать таблицы экспорта символов библиотеки и изменять там имена символов. Конечно, вам все равно нужно поменять заголовки.

Тем не менее, было бы намного проще написать простой скрипт для добавления тегов пространства имен и перекомпилировать библиотеку.

2 голосов
/ 13 июля 2009

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

Очень часто это делали с COM, чтобы скрыть зависимости компоновщика какой-либо библиотеки. Не могу понять, почему вы не можете сделать это с C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...