Компоновщик Visual Studio 2008 хочет разрешить все символы, а не только используемые - PullRequest
0 голосов
/ 17 мая 2010

Мы недавно обновились до Visual Studio 2008 с 2005 года, и я думаю, что эти ошибки начались после этого.

В нашем решении у нас множество проектов. Многие из них являются служебными проектами или проектами, содержащими основные функции, используемые другими проектами. Выходные данные - это файлы lib, которые связаны при сборке проектов, генерирующих окончательные двоичные файлы с использованием параметра «Зависимости проекта ...».

Один из других проектов - назовем его ResultLib - генерирует DLL, и ему требуется одна функция из основного проекта. Эта функция использует только статическую функцию из своего исходного файла, но проект в целом использует множество низкоуровневых функций Windows, а также импортирует DLL. Давайте назовем ее Driver.dll.

Наша проблема в том, что при сборке ExtLib компоновщик жалуется на множество неразрешенных внешних объектов, например, на все функции, экспортированные из Driver.dll, так как его файл lib не указан при компоновке. Если мы попытаемся исправить это, добавив все файлы lib, используемые другими проектами, использующими весь основной проект, наша результирующая DLL ResultLib в итоге импортирует Driver.dll, а также экспортирует все функции, определенные в ней.

Как мы говорим Visual Studio пытаться разрешать только символы, которые фактически используются?

Ответы [ 2 ]

0 голосов
/ 19 мая 2010

Что ж, похоже, я ошибочно подумал, что компоновщик достаточно умен, чтобы удалить неиспользуемые символы перед окончательным связыванием.

Мне нужно было вручную исключить из сборки все ненужные файлы. Для всех проектов, перечисленных как зависимости проекта DLL. Argh.

0 голосов
/ 17 мая 2010

Возможно, ваш объект libs не достаточно гранулирован. Если вы обращаетесь к функции в библиотеке, все другие функции из того же объектного файла включаются, и по определению любые функции, которые они вызывают, должны быть разрешены. Давайте возьмем пример:

В моей библиотеке три функции: f1, f2 и f3. Функции f1 и f2 находятся в одном файле-источнике (и поэтому окажутся в одном и том же объектном файле). Функция f3 находится в отдельном файле.

Если мое приложение вызывает f3, компоновщик будет включать только код для f3. Если мое приложение вызывает f1 или f2, компоновщик всегда будет включать в себя код для других функций.

Вот почему некоторые библиотечные проекты заканчиваются множеством небольших исходных файлов.

...