Ссылка на статическую библиотеку в других статических библиотеках (Visual Studio 2010)

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

Архитектура концептуально выглядит как следующий график:

AppA -> LibA
     \
      -> LibCommon -> LibX
     /             -> LibY
AppB

Каждое приложение (AppA, AppB) находится в разных решениях, чтобы четко разделить вещи.

Чтобы это полностью заработало в Visual Studio 2010, я должен добавить проект каждой библиотеки, используемой приложением, в свое решение, добавить папку, содержащую файлы заголовков, в Additional Include Directories и добавить ссылку на непосредственно используемый проект.

Бывший. Для AppA я бы;

  1. включают проекты LibA, LibCommon, LibX и LibY;
  2. Добавьте путь к LibA и LibCommon в свойство Additional Include Directories
  3. Добавьте ссылку на LibA и LibCommon в основное приложение, затем добавьте ссылки на LibX и LibY в проект LibCommon.

Мой первый вопрос: есть ли способ импортировать только ту библиотеку, которая требуется приложению напрямую? (LibA и LibCommon)

Мой второй вопрос: есть ли лучший способ легко управлять повторно используемым кодом в Visual Studio 2010? (Младший программист здесь!)


person Frank    schedule 22.06.2012    source источник
comment
Первый абзац звучит так, как будто вам действительно нужны динамические библиотеки — при статической компоновке вам придется пересобирать все приложения, использующие библиотеку, чтобы получить обновленную функциональность. Это действительно то, чего вы хотите? Кроме того, если функция находится в библиотеке, вы включаете соответствующие заголовки и связываете библиотеку, вам не следует помещать проект библиотеки в каждое решение.   -  person tmpearce    schedule 22.06.2012
comment
Я думаю, вы можете быть правы, сначала я не хотел нести dll вместе с моим проектом, но мой проект вырос с самого начала. Я рассмотрю статически связанные динамические библиотеки, есть идеи, с чего мне начать? Я знал, что у меня есть способ не включать проекты вместе с библиотеками, я просто не знал, как это сделать.   -  person Frank    schedule 23.06.2012


Ответы (2)


Вам действительно не нужно включать проекты этих библиотек. Вам нужны только файлы .h для компилятора и файлы .lib для компоновщика. Я бы сначала организовал проекты libs в какой-то фиксированной структуре каталогов. Затем я бы добавил что-то вроде этих строк в LibCommon.h:

#include "LibXDir/LibX.h"
#include "LibYDir/LibY.h"
#ifdef _DEBUG
#pragma comment (lib, "LibCommon.lib")
#pragma comment (lib, "LibXDir/Debug/LibX.lib")
#pragma comment (lib, "LibXDir/Debug/LibY.lib")
#else
#pragma comment (lib, "LibCommon.lib")
#pragma comment (lib, "LibXDir/Release/LibX.lib")
#pragma comment (lib, "LibXDir/Release/LibY.lib")
#endif

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

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

person eran    schedule 22.06.2012
comment
Большое спасибо! Это именно то, что мне было нужно! - person Frank; 23.06.2012

Просто добавьте к правильному ответу, опубликованному @eran:

Вы можете включить путь в свойства, Свойства->Свойства конфигурации->Каталоги VC++->Включить каталоги. Вы можете указать путь к библиотеке в свойствах: Свойства->Свойства конфигурации->Каталоги VC++->Каталоги библиотек.

person amalgamate    schedule 17.04.2013