dll Экспорт / init проблема (статические переменные init?) Visual Studio C ++ - PullRequest
0 голосов
/ 16 июня 2011

Я хочу запустить пример плагина для CLANG / LLVM.В частности llvm\tools\clang\examples\PrintFunctionNames.Мне удалось его построить, и я вижу PrintFunctionNames.exports, но я не думаю, что визуальные студии его поддерживают.Файл просто _ZN4llvm8Registry*.Я понятия не имею, что это такое, но я подозреваю, что его пространство имен llvm, класс Registry, который определяется как

template <typename T, typename U = RegistryTraits<T> >
class Registry {

Я подозреваю, что ключевая строка находится в конце файла примера

static FrontendPluginRegistry::Add<PrintFunctionNamesAction> X("print-fns", "print function names");

print-fns - это имя, а 2-й параметр - деск.Когда я пытаюсь загрузить / запустить DLL через

clang -cc1 -load printFunctionNames.dll -plugin print-fns a.c

, я получаю сообщение об ошибке, не найдя print-fns.Я подозреваю, потому что статическая переменная никогда не инициализируется, поэтому она никогда не регистрирует плагин.Неправильное имя DLL приведет к ошибке при загрузке модуля msg.

Я создал файл def и добавил его в свой проект.Это скомпилировано, но до сих пор не повезло.Вот мой файл определения

LIBRARY printFunctionNames
EXPORTS
X DATA

Как мне зарегистрировать плагин или заставить этот пример работать?

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Хорошо, становимся немного яснее.Подводя итог: Visual Studio на самом деле не имеет к этому никакого отношения.Это плагин для исполняемого файла clang.Следовательно, между ними должен быть метод связи (интерфейс плагина).Похоже, что это недокументированный интерфейс, так что он немного отгадывает.

Устранение проблем с DLL выполняется с помощью "Dependency Walker" или "Зависит"Он предлагает режим профилирования, в котором могут быть профилированы все поиски символов.Т.е. если вы профиль clang -cc1 -load printFunctionNames.dll -plugin print-fns a.c, вы увидите, какие символы clang ожидает от вашей DLL, и в каком порядке.

0 голосов
/ 16 июня 2011

Похоже, вы пытаетесь смешать код C ++, созданный двумя разными несовместимыми компиляторами. Это не поддерживается, и ошибка, которую вы видите, является типичным признаком этого: компиляторы C ++ обычно используют «схему искажения имени», а если два компилятора несовместимы, то их схемы искажения имени не совпадают. Один компилятор может пометить llvm::Registry как _ZN4llvm8Registry*, а другой ссылается на него как llvm__Registry.

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