С++. Можете ли вы создать одну статическую библиотеку в другую?

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

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

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

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

Это все исправлено, когда я включил Lib2 в свой тестовый проект.

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

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

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

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

Спасибо!

- Р

Ответ 1

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

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

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

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

 #pragma comment(lib, "libname.lib")

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 6

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