Как объединить несколько статических связанных библиотек в одну dll, если каждая статическая библиотека определяет экспортируемые функции (vc ++ 2008)? - PullRequest
2 голосов
/ 14 марта 2012

Как объединить несколько статических связанных библиотек в одну dll, если каждая статическая библиотека определяет экспортируемые функции (vc ++ 2008)?.

В многопроектном макете, существующем из одного проекта DLL и нескольких подпроектов, которые связаны статически (в проекте DLL). Несмотря на то, что они помечены как __declspec (экспорт), некоторые символы в подпроектах (.lib) отказываются экспортировать свои символы в финальную библиотеку.

Создание файла .def и явная маркировка символов для экспорта могут решить эту проблему. Однако определение того, какие символы помечены как __declspec (экспорт), доказывает проблему. Из-за большого количества экспортируемых классов / функций и, в первую очередь, искажения имен, ведение списка вручную является невозможным процессом, поэтому создание списка символов, помеченных для экспорта, было бы единственно возможным вариантом.

Может ли утилита или директива компилятора сделать это?

Ответы [ 3 ]

3 голосов
/ 14 марта 2012

Использовать файл DEF.

Всегда используйте файл DEF.

Никогда не переставайте использовать файл DEF.

Просто примите, что файл DEF - это то, что нужно использовать.

Прекратите использовать __declspec (dllexport) и уже используйте чертёжный файл определения.

Также не экспортируйте классы. Экспортируйте тех членов класса, которые нужно экспортировать только. И используйте для этого файл DEF.

Серьезно, если вы экспортируете классы без файла DEF, имена функций будут в несколько раз длиннее, чем фактические данные программы. Вы должны использовать порядковые номера для экспорта функций-членов C ++.

2 голосов
/ 15 марта 2012

После битовых проб и ошибок я обнаружил, что с помощью команды lib / def можно создать библиотеку импорта и файл экспорта.Похоже, что файл экспорта содержит все символы, отмеченные символом __declspec (dllexport).Впоследствии файл .exp можно проверить с помощью dumpbin и использовать в качестве ссылки для создания файла определения модуля.

1 голос
/ 23 декабря 2018

Начиная с Visual Studio 2015 Update 2, существует новый способ сделать это, используя параметр компоновщика /WHOLEARCHIVE

Это задокументировано здесь

Опция /WHOLEARCHIVE заставляет компоновщик включать каждый объектный файл либо из указанной статической библиотеки, либо, если библиотека не указана, из всех статических библиотек, указанных в команде LINK.Чтобы указать параметр /WHOLEARCHIVE для нескольких библиотек, вы можете использовать более одного ключа /WHOLEARCHIVE в командной строке компоновщика.По умолчанию компоновщик включает объектные файлы в связанный вывод, только если они экспортируют символы, на которые ссылаются другие объектные файлы в исполняемом файле.Опция /WHOLEARCHIVE заставляет компоновщик обрабатывать все объектные файлы, заархивированные в статической библиотеке, как если бы они были указаны отдельно в командной строке компоновщика.

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