C ++ - Можете ли вы собрать одну статическую библиотеку в другую? - PullRequest
11 голосов
/ 26 марта 2011

У меня возникла странная проблема с проектом Visual Studio 2008, с которым я недавно работал.

Я пытаюсь скомпилировать новую статическую библиотеку, которая использует функции из другой статической библиотеки.(Допустим, Lib1 - это мой проект статической библиотеки, а Lib2 - это файл lib, от которого зависит Lib1).

Я могу собрать lib1 без проблем;Он включает заголовочные файлы для lib2 и вызывает его функции, и проблем нет.

Проблема заключается в том, что я создаю отдельный тестовый проект, в котором Lib1 является зависимостью;это не будет строить, и я получаю ошибки компоновщика.Неразрешенные внешние проблемы - это функции, которые я пытаюсь вызвать в Lib1 из Lib2.

Это все исправлено, когда я также включаю Lib2 в свой тестовый проект.мне, конечно;Я могу проверить, что Lib2 не встроен в Lib1 ..

Мой вопрос: есть ли способ сделать это?В идеале я хотел бы иметь возможность развернуть Lib1 как отдельную библиотеку, не требуя Lib2.(Lib2 на самом деле является просто Lib из Windows Platform SDK, так что это не так уж важно ...)

Разве это не разрешено, потому что это позволило бы людям "скрывать" сторонние библиотеки самостоятельно,или что-то?

Каким будет профессиональный подход к этой проблеме?

Спасибо!

- R

Ответы [ 6 ]

3 голосов
/ 27 марта 2011

Я бы не советовал использовать библиотекаря для переноса содержимого библиотеки Windows в вашу собственную библиотеку - скорее всего, это против лицензии.

Я вижу две возможности

  1. Документированиезависимость
  2. Использование #pragma в вашем .h файле, который запрашивает связывание с .lib.Если VS может найти его, это то же самое, что включить его в вашу линию связи.

http://msdn.microsoft.com/en-us/library/7f0aews7(VS.80).aspx

 #pragma comment(lib, "libname.lib")
3 голосов
/ 27 марта 2011

Вам нужно использовать инструмент под названием библиотекарь, чтобы сделать это. Библиотекарь позволяет создавать и изменять файлы библиотеки (.lib). В визуальной студии проверьте в разделе Библиотекаря свойства вашего проекта. Версия для командной строки также поставляется с Visual Studio (lib.exe).

2 голосов
/ 26 марта 2011

Просто документируйте зависимости вашей библиотеки.

Пока библиотека, от которой вы зависите, доступна любому, кто может использовать вашу библиотеку, это предпочтительное решение. Особенно если учесть, что пользователь библиотеки может также зависеть от этой библиотеки SDK платформы - если он будет встроен, он получит забавные ошибки компоновщика с несколькими символами.

1 голос
/ 27 марта 2011

Вместо простого документирования ваших зависимостей, используйте #pragma comment(lib, 'lib2name') в своем коде, чтобы компоновщик автоматически включал другую библиотеку.Поскольку вы сказали, что используете стандартную библиотеку, поставляемую с SDK, это должно устранить всю нагрузку на приложение.

1 голос
/ 26 марта 2011

Если вы действительно хотите это сделать, вы можете извлечь файлы .obj из Lib2 и добавить их в Lib1.

См. Как извлечь подпрограммы .OBJ из файлов .LIB с помощью LIB.EXE - Я надеюсь, что это все еще актуально для VS2008.

1 голос
/ 26 марта 2011

Это довольно обычная проблема - обычно вы не пытаетесь включить 'lib2' в 'lib1', а просто документируете, с чем она должна быть связана, чтобы работать. Нет ничего плохого в объявлении об использовании других библиотек (кроме вопросов лицензирования, разумеется), так что вы уже поступаете правильно.

...