Используя Visual Studio 2010, как можно создать ссылку на DLL, созданную Visual Studio 2008

Мои вопросы:

  • Можно ли связать VS2008 сгенерированы библиотеки DLL с помощью VS2010?

  • Если нет, то почему это кажется можно ссылаться на статические библиотеки генерируется VS2008.

  • Я вижу, что VS2010 теперь имеет платформу Опция Toolset. Но это позволит люди устанавливают его на v90 вместо v100 хотя у них нет VS2008 установлен?

  • Хотя я использую компилятор / Z7 переключатель, почему мне все еще нужно иметь .pdb для отладки библиотек DLL.

Подробности

Я могу использовать Visual Studio 2010 для связывания со своими статическими библиотеками Leptonica C, созданными Visual Studio 2008, без каких-либо проблем. (См. Раздел Ссылки ниже для получения подробной информации о том, как я создаю Leptonica и ссылаюсь на нее.)

Однако, когда я пытаюсь связать ту же программу (leptonlib-1.67 \ prog \ ioformats_reg.c) с моя VS2008 сгенерировала DLL версию Leptonica, программа вылетает. Отлаживая, я вижу, что проблема в том, что ioformats_reg.c делает это:

fp = fopen(filename, "rb"); /* in ioformats_reg.c */

и вскоре после этого в leptonlib.dll выполняется следующее, что приводит к сбою:

rewind(fp);                 /* in leptonlib.dll */

Как связать с правильной C Run-Time (CRT ) library говорит:

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

Если вы все же решите смешивать библиотеки CRT, помните, что у вас есть два отдельных копии ЭЛТ, с отдельными и различные состояния, поэтому вы должны быть осторожно относись к тому, что ты пытаешься сделать через границу CRT. Много способы попасть в беду с двумя ЭЛТ. Вот лишь некоторые из них:

  • Есть две отдельные кучи. Вы не можете выделить (явно с новым, malloc или так далее - или неявно с strdup, strstreambuf :: str или так далее), а затем передайте указатель через CRT-граница, которую нужно освободить.
  • Вы не можете передать FILE * или дескриптор файла через CRT-границу и ожидайте, что "stdio low-level IO" будет
  • Нельзя установить языковой стандарт в одном и ожидать, что будет установлен другой языковой стандарт.

Начиная с Visual C ++ 4.0, компоновщик выдаст предупреждение (LNK4098) если результирующий модуль пытается объединить более одной копии ЭЛТ библиотека. Для получения дополнительной информации выполните поиск файл справки для LNK4098.

Но я не получаю сообщения об ошибках LNK4098 от компоновщика VS2010.

Leptonica использует fopen (), rewind (), fclose () и т. д., которые документация классифицирует как потоковый ввод-вывод, а не как «низкоуровневый ввод-вывод», но они действительно передают параметры FILE. Я полагаю, что это то, что Microsoft имеет в виду, когда говорит «stdio low-level IO».

/ MD, / MT, / LD (Use Run-Time Library) говорит:

Все модули переданы заданному призыв к компоновщик должен быть скомпилирован с той же средой выполнения параметр компилятора библиотеки (/ MD, / MT, /LD).

Он не говорит, что все модули должны быть скомпилированы одной и той же версией компилятора. Я использую / MD (или / MDd) последовательно и правильно для всех своих модулей.

При использовании DLL выясняется, что библиотеки DLL не только должны использовать тот же переключатель / MD, но они также должны быть скомпилированы VS2010?

Похоже, мой тестовый пример показывает, что соединение со статическими библиотеками, созданными VS2008, работает, но, может быть, мне просто повезло? Почему связь со статическими библиотеками, сгенерированными VS2008, работает, а связь с DLL, созданной VS2008, не работает при использовании VS2010?

Означает ли это, что мне нужно отправлять отдельные библиотеки DLL для использования пользователями VS2008 и VS2010?


И что о новой опции Platform Toolset? Могут ли пользователи VS2010 изменить это на v900, даже если у них нет VS2008? Если так, тогда я мог бы просто посоветовать людям изменить этот параметр для моего проекта Leptonlib-1.67.


Наконец, я использую переключатель / Z7 при создании своих библиотек. В документации по адресу / Z7, / Zi, / ZI (формат отладочной информации) указано:

/ Z7

Создает файл .obj, содержащий полный символический отладочная информация для использования с отладчиком. Символьная отладочная информация включает имена и типы переменных, а также функции и строки числа. Файл .pdb не создается.

Для распространителей сторонних библиотек существует преимущество отсутствия файла .pdb. Однако Файлы .obj для предварительно скомпилированных заголовков необходимы на этапе компоновки и отладки. Если есть только информация о типе (без кода) в объектных файлах .pch, вам также придется скомпилировать с / Yl (вводить справочник PCH для библиотеки отладки)

Я не использую предварительно скомпилированные заголовки. Однако только когда у меня есть доступный .pdb, я могу отлаживать свои DLL Leptonica. Кроме того, даже несмотря на то, что он говорит: «Файл .pdb не создается». .pdb фактически создается с моими текущими настройками проекта. Имеет ли / PDB в моих опциях компоновщика как-то переопределить указание / Z7 во время компиляции?

Edit: Также я должен упомянуть, что я могу отлаживать статическую библиотечную версию Leptonica даже без какого-либо PDB.

Ссылки

Leptonica - это библиотека обработки изображений C с открытым исходным кодом, созданная Дэном Блумбергом, доступная по адресу http://www.leptonica.com . Я предоставляю инструкции по сборке Leptonica с использованием VS2008 / VS2010, а также предоставляю двоичные файлы Windows.

См. http: // leptonica. com / vs2008doc / building-leptonlib.html и http://leptonica.com/vs2008doc/building-image-libraries.html для получения подробной информации о том, как я создаю библиотеки Leptonica. http://www.leptonica.org/vs2008doc/building-prog-dir.html обсуждает, как я связываю ioformats_reg.

Мое решение Leptonica VS2008 доступно по адресу http: // www. leptonica.com/source/vs2008-1.67.zip . Мои двоичные библиотеки находятся в zip-файле по адресу http://leptonica.com/source/leptonica-1.67-win32-lib-include-dirs.zip . Источники Leptonica находятся на http://www.leptonica.com/source/leptonlib-1.67.tar.gz

12
задан T Powers 14 November 2010 в 07:19
поделиться