Как компоновщик выбирает .lib файлы для включения в сборку? - PullRequest
2 голосов
/ 24 февраля 2012

Некоторые не очень значимые фоны: я пытаюсь собрать CGAL с использованием Visual Studio 2010. Это зависит от библиотек GMP и MPFR.Я строю свой проект в зависимости от CGAL. ​​

При создании моего проекта у меня возникает ошибка компоновщика:

error LNK1104: cannot open file 'gmp-vc100-mt-sgd.lib'

Однако я сказал CGAL использовать GMP в файле gmp.lib.И это действительно используется.Но каким-то образом компоновщик также хочет gmp-vc100-mt-sgd.lib.Итак, «gmp-vc100-mt-sgd.lib» является именем по умолчанию, и я изменил его на «gmp.lib», изменив какой-то файл конфигурации CHAL .h.Я проверил все возможные места:

  • Нет такой библиотеки в Linker-> Дополнительные зависимости в моем проекте
  • Нет ссылок из моего проекта на эту библиотеку
  • Выше приведено для всех проектов в моем решении
  • Ни в каких включенных файлах .h нет директив #pragma comment(lib, "gmp-vc100-mt-sgd.lib") (я сгенерировал вывод препроцессора .i для всех файлов в моем проекте)

Я пытался перестроить CGAL и перестроить свое решение безрезультатно - компоновщик все еще хочет старый файл 'gmp-vc100-mt-sgd.lib'.

Я застрял.Есть ли другие варианты, чтобы проверить?Какие-нибудь другие источники, откуда берутся дополнительные зависимости .lib?Единственные упоминания о gmp-vc100-mt-sgd.lib находятся в файлах Clib .lib и .obj в директиве / DEFAULTLIB:.Я искал все файлы в CGAL-решении, чтобы найти упоминание этого волшебного имени gmp-vc100-mt-sgd.lib без результата.

Я проверил каждую директиву #pragma в файле .i, чтобы убедиться, что имя gmp-vc100-mt-sgd.lib не разделен на части, поэтому я не могу его найти.Это абсолютно не представлено там.

Есть идеи?

1 Ответ

0 голосов
/ 27 февраля 2012

Хорошо, я понял это.Проблема действительно была в этой / DEFAULTLIB, которую я нашел внутри файла CGAL.lib.

Оказалось, что когда Visual Studio строит .lib-файл и встречает директиву #pragma comment, она оставляет некоторые инструкции, как связать эту библиотеку.Как я понимаю, он просто указывает компоновщику использовать опцию / DEFAULTLIB при связывании с ним.И тогда компоновщик пытается добавить эту библиотеку в список поиска, даже если она не имеет неразрешенных внешних элементов.

Поэтому я пытался удалить директиву #pragma comment при создании моего проекта, но я должен был попытаться удалить ее, когдасам проект CGAL.Последний работает отлично.

...