Связывание библиотеки без файла заголовка?
Я пытаюсь связать статическую библиотеку на 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")