Может ли Visual Studio создать статическую библиотеку без символов? - PullRequest
2 голосов
/ 17 января 2011

Я разделю этот вопрос на 3 части:

  1. Я хотел бы создать статическую библиотеку и обрезать от ее символов. (Отладочная информация уже не включена) Аналогично команде strip в linux. Можно ли это сделать?

  2. Есть ли в среде env инструмент, эквивалентный nm в linux?

  3. При создании статической библиотеки с использованием VS2008. Можно ли определить сценарий, который будет исключать некоторые из созданных файлов .obj из сборки и из статической библиотеки?
    Это может быть динамический ? Я имею в виду, что я определю режим компиляции в скрипте , и это приведет к исключению определенных объектных файлов из сборки

Ответы [ 4 ]

3 голосов
/ 17 января 2011

Если что-то видно, что, по вашему мнению, не должно быть, попробуйте объявить это ключевым словом static.Это говорит компилятору, что он доступен только текущему модулю.

2 голосов
/ 04 июня 2013

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

Статическая библиотека - это нечто большее, чем коллекция файлов .obj. Внутренние зависимости еще не разрешены, и они не будут разрешены до времени ссылки.

Например, если ваш .lib состоит из foo.obj и bar.obj, и в foo.obj есть вызов функции, определенной в bar.obj, то этот символ должен быть доступен во время ссылки, даже если ничего за пределами библиотеки должна быть возможность его увидеть.

По этой причине вы не можете удалить символы (возможно, за исключением статических символов области файла). Даже методы класса, которые являются защищенными или частными (в смысле C ++), будут существовать в таблице символов, поскольку обеспечение видимости - это проблема времени компиляции, а не времени соединения.

Напротив, динамическая библиотека - это отдельный двоичный файл, который уже связан. Ссылки с foo.obj на bar.obj уже разрешены. Таким образом, в DLL можно удалить символы, кроме тех, которые должны быть экспортированы (и даже те, которые могут быть переименованы или заменены на порядковые).

Если ваша DLL предоставляет простой C API, то все готово. Но если вы хотите представить класс C ++, вы, вероятно, в конечном итоге экспортируете все его методы, даже защищенные и закрытые (поскольку встраивание во внешнее приложение может привести к прямым вызовам закрытых методов).

1 голос
/ 17 января 2011
  1. Нет, как вы думаете, как пользователи статической библиотеки будут ссылаться на нее, не зная, где определены символы, которые они используют?
  2. Да, попробуйте утилиту DUMPBIN .
  3. Ну да. Вы можете запустить утилиту LIB с /REMOVE:foo.

Тем не менее, я думаю, что вы делаете что-то, что либо не стоит делать, либо может быть сделано намного проще, чем удаление членов библиотеки.

0 голосов
/ 14 октября 2011

Я продолжал находить имена определенных (но не всех) статических функций в файлах .obj, созданных VS2010. Интересно, что они были видны в моих файлах Release .obj, но не в файлах Debug .obj. Я просто использовал строки cygwin для поиска:

$ strings myObjectFile.obj | grep myStaticFunctionName

Я отследил его до настройки «Оптимизация всей программы = Да» («/ GL»). Когда я переключил это на «Нет», имена функций больше не появляются.

Обновление: в качестве дополнительного теста я открыл «очищенный» myObjectFile.obj в vim, и я все еще могу их найти (с помощью: set encoding = utf-8 или: set encoding = latin1) Я не уверен, почему строки пропускали спички. Ну хорошо.

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