Проблема компоновщика: как определить, откуда исходит " / DEFAULTLIB

Я пытаюсь найти хороший способ определить, какой модуль во время ссылки вызывает определенную библиотеку для обработки как "/DEFAULTLIB", как видно из подробного вывода компоновщика из Visual Studio.

вот моя ситуация, у меня есть несколько статических библиотек предпосылки и выхода и отладочная версия (BlahD.Либ и бла.библиотека.) По какой-то причине во время ссылки все * D. lib обрабатываются как библиотеки по умолчанию, хотя я создаю выпуск с не-отладкой библиотеки определены как "дополнительные зависимости". Если я никогда не создам отладочные версии статических библиотек, эти файлы *D не будут существовать, и будет ошибка компоновщика (не удается открыть файл).

Я могу успешно построить свой проект, указав /NODEFAULTLIB для всех этих нарушений .lib-файлы. Все библиотеки релизов соединяются, и все счастливы. Но я хочу понять, что здесь происходит. Что заставляет эти файлы * D. lib обрабатываться компоновщиком? Мой только надеюсь написать какой-то скрипт, который сбрасывает все в этом массивном проекте и его зависимых проектах (поддержка microsoft)? Даже тогда я не понимаю, что искать в выводе dumpbin, относится ли это к .lib файлы, а также .obj файлы?

3 ответов


искать #Pragma комментарий (lib) в источнике. Посмотрите, зависит ли это от #define - это обычный способ для SDK гарантировать, что правильные библиотеки связаны, и вам может потребоваться определить THESDK_DEBUG или THESDK_RELEASE для логики, чтобы работать.

дополнительная информация: Я обнаружил в Visual Studio 2008, что даже комментируя заявление из *.idl файл не работает, например:

//cpp_quote("#pragma comment( lib, \"MYLIB.lib\")")

компилятор все еще добавляет Библиотеки MyLib.lib как DEFAULTLIB, и он заканчивается в *.файл obj. Убедитесь, что вы полностью удалили строку из кода!


У меня была похожая проблема. Я смог решить ее, только проанализировав *.obj-файлы, как вы предложили. Для этого я выполнил следующую команду через командную строку Visual Studio (во временной папке проекта, где *.создаются файлы obj):

for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt

затем я использовал Notepad++ для поиска имени оскорбительной библиотеки во всех этих *.директивы.txt-файл. Это показало, какой проект ссылается на неправильный lib.

Примечание: Вы можете изменить по 3-й партии *.lib-файлы, которые может использовать ваш проект, а не только *.obj-файлы. Директивы "/ DEFAULTLIB " также могут исходить от них.

Примечание: вам может понадобиться использовать *.o вместо *.параметр obj


ссылке /verbose опция и поиск выходных данных для имени рассматриваемой библиотеки. Это покажет вам, какой объектный файл перетащил библиотеку в ссылку.