Слабые ссылки в стиле GCC в Visual Studio? - PullRequest
38 голосов
/ 18 февраля 2010

GCC может слабо создавать символьную ссылку через __attribute__((weak)). Я хочу использовать слабый символ в статической библиотеке, который пользователи могут переопределить в своем приложении. Слабый символ стиля GCC позволил бы мне сделать это, но я не знаю, можно ли это сделать с visual studio.

Имеет ли Visual Studio аналогичную функцию?

Ответы [ 6 ]

69 голосов
/ 17 июля 2012

Вы можете сделать это, вот пример на C:

/*
 * pWeakValue MUST be an extern const variable, which will be aliased to
 * pDefaultWeakValue if no real user definition is present, thanks to the
 * alternatename directive.
 */

extern const char * pWeakValue;
extern const char * pDefaultWeakValue = NULL;

#pragma comment(linker, "/alternatename:_pWeakValue=_pDefaultWeakValue")
17 голосов
/ 18 февраля 2010

MSVC ++ имеет __declspec(selectany), который покрывает часть функциональности слабых символов: он позволяет вам определять несколько идентичных символов с помощью внешней связи, предлагая компилятору выбрать любой из нескольких доступных. Однако я не думаю, что в MSVC ++ есть что-то, что могло бы покрыть другую часть слабой функциональности символов: возможность предоставлять «заменяемые» определения в библиотеке.

Кстати, это заставляет задуматься, как работает поддержка стандартных сменных функций ::operator new и ::operator delete в MSVC ++.

11 голосов
/ 18 февраля 2010

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

Не могу сказать, что пробовал это некоторое время, но я был бы удивлен, если бы они изменили это поведение (особенно, если определенные в .obj символы переопределяют символы в .lib-файлах).

3 голосов
/ 17 октября 2012

Единственный способ, которым я знаю. Поместите каждый символ в отдельную библиотеку. Пользовательские объекты с переопределениями также должны быть объединены с библиотекой. Затем свяжите все вместе с приложением. Пользовательская библиотека должна быть указана в качестве входного файла, ваша библиотека должна быть передана компоновщику с использованием опции /DEFAULTLIB:.

3 голосов
/ 18 февраля 2010

Нет MS-VC, эквивалентного этому атрибуту. См. http://connect.microsoft.com/VisualStudio/feedback/details/505028/add-weak-function-references-for-visual-c-c. Я собираюсь предложить что-то ужасное: читая цель этого здесь: http://www.kolpackov.net/pipermail/notes/2004-March/000006.html по сути, чтобы определить функции, которые, если их символы существуют, используются, в противном случае, нет, так что ...

Почему бы не использовать препроцессор для этой цели с огромным предостережением "если вам нужно сделать это вообще"? (Я не фанат рекомендовать препроцессор).

Пример:

#ifdef USE_MY_FUNCTION
     extern void function();
#endif

затем вызовите соответствующим образом в логике приложения, окруженной #ifdef операторами. Если ваша статическая библиотека связана, как часть процесса компоновки, настройте определения для определения USE_MY_FUNCTION.

Не совсем прямой эквивалент и очень уродливый, но это лучшее, что я могу придумать.

0 голосов
/ 18 февраля 2010

Один из способов сделать это - реализовать его вручную с помощью LoadLibrary и GetProcAddress .

...