Связывание библиотеки без файла заголовка?

Я пытаюсь связать статическую библиотеку на C++ с помощью Visual Studio 2010. Проблема в том, что в библиотеке (и сопровождающем заголовке ) есть много объектов MFC. Я хотел бы вызвать одну из функций библиотеки без перекомпиляции моего проекта для включения MFC или перекомпиляции библиотеки, чтобы не использовать MFC. этой статья codeproject, похоже, подразумевает, что это возможно, если я определяю функцию как внешнюю в моем проекте (используя " extern" ключевое слово.)

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

статья правильная? А если нет, то возможна ли такая связь каким-либо другим способом?

4 ответов


вы можете абсолютно это сделать, вам просто нужно найти точный правильный прототип функции.

используйте "dumpbin" для сброса таблицы символов и найдите свою функцию.

Если имя функции выглядит нормально-тогда определите его и свяжите с ним, используя "extern C". Если символ является C++ mangled, то вам нужно будет demangle его, чтобы найти прототип.

Если функция не находится в таблице символов-тогда она была определена статически в lib и не является доступный. Тогда тебе конец. Нет никакого способа.


Если функция, которую вы хотите вызвать, использует биты MFC, вам также придется добавить поддержку MFC в свой проект. Однако, если это не так, и функция была экспортирована библиотекой, вы можете просто добавить прототип функции в файл, где вы хотите ее вызвать, а затем связать библиотеку с исполняемым файлом.

например, вы добавите такую строку в файл, где вы вызываете экспортируемую функцию:

void __stdcall foo( int );

убедитесь, что вы получаете вызывающее соглашение правильное, оно может отличаться от __stdcall. Кроме того, вам может потребоваться добавить extern "C" для предотвращения искажения имени.


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

если требуемая функция находится в модуле, который не имеет других зависимостей или все зависимости которого содержатся в текущей Библиотеке, вы можете связать ее после создания надлежащего прототипа функции. Если есть дополнительные зависимости, то вам не повезло.


например, если вы хотите OT вызова timeGetTime и у вас есть причина не включать mmsystem.h из-за некоторых конфликтов вы можете сделать следующее:

extern "C" DWORD WINAPI timeGetTime(void);
#pragma comment(lib, "winmm.lib")