Связывание нескольких статических файлов .lib в один монолитный файл .lib с использованием VS2008 SP1 с использованием CMake 2.8.x - PullRequest
7 голосов
/ 11 декабря 2010

Относительно использования cmake для связывания объектных файлов в файле lib.xxxx.a , но не совсем так, я построил несколько статических библиотек в Windows, используя CMake 2.8.x, используя VS2008 SP1. Есть ли способ только через CMake связать все файлы .obj внутри всех существующих статических библиотек в одну большую монолитную библиотеку, предпочтительно с помощью функции add_library CMake, или с помощью другой аналогичной конструкции?

Я думаю, что ответ «нет», и поэтому я подумал о том, чтобы развернуть свою собственную с помощью пользовательской команды с помощью обычного подхода add_custom_command + add_custom_target, который просто создает библиотеку вручную, предоставляя все остальные библиотеки .obj файлов при вызове LINK.EXE. Но я вижу некоторые проблемы с этим подходом:

  1. Я не смог найти переменную CMake, которая указывает полный путь к исполняемому файлу LINK.EXE. Затем мне пришлось бы каким-то образом получить путь к LINK.EXE, используя хрупкую эвристику: он хрупок в том смысле, что разные версии Visual Studio могут найти файл LINK.EXE в разных каталогах, и мне нужно, чтобы это работало для обоих 32-разрядные и 64-разрядные условия компилятора Windows, а также устойчивость к обновлениям между VS2008 и будущими версиями компилятора.
  2. Мне нужно найти способ найти все файлы .obj других статических библиотек, во время сборки против во время CMake , поскольку во время CMake. Конечно, файлы obj не существуют (всегда). Из соображений производительности сборки я не хочу извлекать файлы .obj из файлов .lib ради добавления их в командную строку LINK.EXE, поэтому конструкция FILE(GLOB...) будет моей лучшей второй альтернативой в этом случай.
  3. Может быть возможно просто позвонить LINK.EXE через: LINK.EXE /OUT:monolithic.lib lib1.lib lib2.lib ..., но, возможно, не все .obj будут включены (РЕДАКТИРОВАТЬ: я подтвердил, что LINK.EXE пропускает некоторые файлы .obj из lib1.lib lib2.lib ... без какой-либо диагностики сообщения, объясняющие почему, поэтому этот подход не является началом); онлайн-документы на LINK.EXE пока неясны. У кого-нибудь есть опыт использования LINK.EXE таким образом?

Спасибо

Brent

P.S., я знаю, как создать DLL с помощью CMake, но я специально не хочу прибегать к созданию DLL в данный момент времени.

1 Ответ

11 голосов
/ 19 января 2011

Создайте статическую библиотеку, «объединенную» с фиктивным исходным файлом, и добавьте библиотеки, которые нужно объединить, в STATIC_LIBRARY_FLAGS, чтобы они стали дополнительным входом для lib.exe.

Это было бы что-то вроде:

ADD_LIBRARY (объединенная STATIC dummy.c)

SET_TARGET_PROPERTIES (объединенные свойства
STATIC_LIBRARY_FLAGS "полный \ путь \ к \ lib1.lib полный \ путь \ к \ lib2.lib")

Этот подход используется внутри MySQL, здесь есть более общий макрос для объединения статических библиотек, который работает кроссплатформенно. Его можно найти здесь http://www.mail-archive.com/cmake@cmake.org/msg28670/libutils.cmake

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