Проблема с компоновщиком: как определить, откуда исходит «/ DEFAULTLIB» - PullRequest
13 голосов
/ 09 марта 2011

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

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

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

Ответы [ 3 ]

10 голосов
/ 03 июня 2013

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

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

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

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

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

7 голосов
/ 09 марта 2011

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

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

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

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

0 голосов
/ 30 июня 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...