Ошибка Clrdump (C ++) LNK2019: неразрешенный внешний символ __imp__RegisterFilter @ 8, указанный в функции _main - PullRequest
5 голосов
/ 02 декабря 2008

Я использую систему makefile с компилятором pvcs (с использованием компилятора Microsoft Visual C ++, 2008) и получаю несколько ошибок ссылок в виде:

error LNK2019: unresolved external symbol __imp__RegisterFilter@8 referenced in function _main

Это происходит, несмотря на объявление extern "C", а именно:

extern "C" int CLRDUMP_API RegisterFilter( LPCWSTR pDumpFileName, unsigned long DumpType );

Кроме того, в makeexe.mak библиотека связана как:

$ (COMPILEBASE) \ lib \ clrdump.lib \

Если честно, я не являюсь экспертом в make-файлах, и я перехожу из системы с Microsoft Visual C ++ 6.0 на 2008. Это изменение может иметь отношение к ошибкам связи, так как система работала до этого.

Любая помощь будет принята с благодарностью.

Заранее спасибо,

С уважением, Джозеф

- Редактировать 1 -

Кто-нибудь знает, как включить многословность в системе make-файлов pvcs?

Обратите внимание, что вышеуказанная функция уже оформлена компилятором и имеет

__imp__RegisterFilter@8

, тогда как функция C ++ это просто

RegisterFilter

Спасибо за помощь, но если кто-нибудь сможет опубликовать более полное решение, это также будет очень признательно.

С уважением, Джозеф

- Изменить 2 -

Какой-то добрый человек опубликовал это, но когда я вошел в систему, оно исчезло:

Префикс imp указывает, что эта функция импортирована из DLL. Проверьте определение CLRDUMP_API - это __declspec(dllimport)? См. Эту статью для получения дополнительной информации.

Была рабочая ссылка, но я ее потерял, но, думаю, всегда можно поискать тему.

Спасибо, кем бы вы ни были!

- Редактировать 3 -

Спасибо, ChrisN (мне еще не разрешено голосовать). Несмотря на использование кнопки «Обновить», ваш ответ исчез, но затем снова появился после того, как я разместил вырезанную нить.

Это мое определение этого:

define CLRDUMP_API __declspec(dllimport) __stdcall

Я предполагаю, что __stdcall в порядке?

- Изменить 4 -

Хотя я ценю усилия тех, кто ответил, в частности ChrisN, по крайней мере, на моей конкретной системе, ошибка ссылки остается. Так что, если у кого-то есть дальнейшее понимание, я был бы признателен. Еще раз спасибо.

Ответы [ 6 ]

14 голосов
/ 03 декабря 2008

Префикс __imp_ указывает, что компоновщик ожидает, что эта функция будет импортирована из DLL.

Является ли библиотека clrdump из этой страницы ? Если это так, обратите внимание, что extern "C" не используется в заголовочном файле, поставляемом с библиотекой. Я подтвердил это с помощью следующей команды:

dumpbin /exports clrdump.lib

, который выдает следующий вывод для RegisterFilter - это искаженное имя функции C ++:

?RegisterFilter@@YGHPBGK@Z (int __stdcall RegisterFilter(unsigned short const *,unsigned long))

Я попытался создать пример программы, используя clrdump.lib, используя Visual Studio 2008. Вот мой код:

#include <windows.h>
#include "ClrDump.h"

int _tmain(int argc, _TCHAR* argv[])
{
    RegisterFilter(L"", 0);
    return 0;
}

Построение этого привело к следующей ошибке компоновщика:

LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall RegisterFilter(wchar_t const *,unsigned long)" (__imp_?RegisterFilter@@YGHPB_WK@Z)

Код строится нормально с Visual C ++ 6.0.

Обратите внимание, что вывод dumpbin показывает первый параметр для RegisterFilter как unsigned short const *, но ошибка компоновщика показывает wchar_t const *. В Visual C ++ 6.0 wchar_t обычно является typedef для unsigned short, тогда как в более поздних версиях это отдельный встроенный тип.

Чтобы обойти эту проблему в Visual Studio 2008, я установил для параметра «Обрабатывать wchar_t как встроенный тип» значение «Нет» (укажите /Zc:wchar_t- в командной строке компилятора), и теперь код строится нормально.

Извините за путаницу с моим предыдущим ответом. Я надеюсь, что это более полезно!

5 голосов
/ 30 сентября 2011

У меня недавно была такая же проблема. Я исключил библиотеку, чтобы избежать столкновения, и все ошибки исчезли, за исключением ошибок LINK (как вы описали). Когда я поменял библиотеку на другую (я исключал (игнорирую) MSVCRT.lib, теперь я исключаю (игнорирую) LIBCMT.lib) проблема исчезла. Убедитесь, что вы где-то не перепутали библиотеки. В моем случае компоновщик завершился с ошибкой «не могу найти imp _aligned_malloc». Конечно, в моем коде не было метода с таким именем. Компилятор предшествовал imp . Именно поэтому я не знаю, за исключением того, что проблема исчезла, когда я поменял исключение (игнорировать), как описано выше.

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

3 голосов
/ 05 мая 2011

Не знаю, так ли это, но префикс imp может означать, что вы компилируете библиотеку x64 в проекте Win32.

3 голосов
/ 31 марта 2010

Я создавал простое приложение Win32 c ++ в VS2005 и получал эту ошибку:

LNK2019: unresolved external symbol __imp__somefunction

Это приложение использовало листы свойств, поэтому ему требовался этот заголовок (prsht.h).

Решение моей проблемы было следующим: в программе Свойства → Свойства конфигурации → Линкер → Общие , я установил Дополнительные каталоги библиотек на "C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Lib".

Также в программе Свойства → Свойства конфигурации → Линкер → Командная строка для Дополнительные параметры , я добавил ComCtl32.Lib ComDlg32.Lib.

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

3 голосов
/ 02 декабря 2008

Попробуйте включить подробный вывод для вашего компоновщика (обычно это переключатель командной строки). Это покажет вам, как компоновщик пытается разрешить символ, так что вы можете увидеть, если:

  • Подпись символа - это то, что вы ожидаете
  • компоновщик ищет нужное место для вашей библиотеки

Надеюсь, это поможет!

1 голос
/ 06 августа 2011

Использование файла .DEF

Если вы решите использовать __declspec (dllimport) вместе с файлом .DEF, вам следует изменить файл .DEF на использование DATA или CONSTANT, чтобы уменьшить вероятность того, что неправильное кодирование вызовет проблему:

// project.def
LIBRARY project
EXPORTS
   ulDataInDll   CONSTANT

Следующая таблица показывает, почему:

Keyword      Emits in the import library   Exports
CONSTANT     _imp_ulDataInDll              _ulDataInDll
             _ulDataInDll                  

DATA         _imp_ulDataInDll              _ulDataInDll

http://msdn.microsoft.com/en-us/library/aa271769(v=vs.60).aspx

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