2010-02-15 3 views
2

У меня есть приложение, над которым я работаю, использует две сторонние библиотеки, каждая из которых содержит предварительно скомпилированные библиотеки и библиотеки DLL, один из которых предоставляет необходимые файлы .lib как для отладочных, так и для релизов (A[d].lib), а другой - только .lib файлы для релизов (B.lib).Как отлаживать приложение, когда сторонняя библиотека не обеспечивает отладочную сборку?

Компиляция в режиме выпуска (с использованием MSVC9) работает отлично, однако попытки компиляции в режиме отладки не удается, потому что третья сторона A требует LIBCMTD.lib (или MSVCRTD.lib), а третья сторона B требует LIBCMT.lib (или MSVCRT.lib).

Могу ли я обойти это или я застрял отладки в режиме выпуска?

ответ

3

Вы хотите, чтобы полный режим отладки, или вы просто хотите отлаживать? Если это так, просто перейдите к параметрам компоновщика и включите генерацию символической информации (.pdb). Таким образом, вы можете использовать отладчик в своем собственном коде, пройти через строки и посмотреть на переменные. Если вас раздражают изменения в потоке управления, создаваемые оптимизаторами, вы можете перейти к параметрам компилятора и отключить оптимизацию. Таким образом, вы можете использовать отладчик И построить в режиме выпуска. Когда вы довольны своим кодом, вы просто измените настройки на создание оптимизированного кода.

+1

На самом деле, я бы начал с противоположного конца: просто возьмите существующую конфигурацию отладки и ссылку на LIBCMT.lib, A.lib и B.lib. Но точка одна и та же: создайте исполняемый файл, который не оптимизирован, имеет информацию об отладке, но ссылки на выпуск libs. – MSalters

+0

@Carsten: Да, я бы хотел отладить полный отладчик, в конце концов, я выбрал ваш подход и MSalters (+1!). Спасибо за совет! – Geoff

1

Попробуйте пройти /NODEFAULTLIB:LIBCMT в линкере.

+0

С флагом вы упоминаете я вместо этого получаю 'ошибка LNK2001: неразрешенный внешний символ __invalid_parameter_noinfo' (из-за' B', который требует его). – Geoff

+0

Google, похоже, дает хиты для использования '_SECURE_SCL = 0' в препроцессоре, чтобы исправить это. –

+0

Я пробовал различные комбинации других решений, связанных с _SECURE_SCL, безрезультатно. – Geoff

1

Я не уверен, что это можно сделать непосредственно со статическими библиотеками. Я предлагаю вам пакетную библиотеку B в динамическую библиотеку, а затем используйте эту новую библиотеку B. Ваши проблемы исчезнут.

+0

Это, безусловно, будет хорошим решением для производственного программного обеспечения, когда все будет сглажено, на данный момент это похоже на слишком много неприятностей, спасибо! – Geoff

Смежные вопросы