Проблема компоновщика: как определить, откуда исходит " / 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
опция и поиск выходных данных для имени рассматриваемой библиотеки. Это покажет вам, какой объектный файл перетащил библиотеку в ссылку.