Как настроить зависимости вложенных библиотек? - PullRequest
2 голосов
/ 11 октября 2011

У нас есть довольно большое решение (состоящее из 40 проектов), которое я недавно обновил до Visual Studio 2010. При обновлении я подумал, что было бы неплохо очистить зависимости проекта.Это то, что я не могу понять правильно.

Основной .exe (C #) зависит от проекта C ++ / CLI, который оборачивает неуправляемый проект библиотеки C ++, который сам зависит от нескольких сторонних библиотек.Таким образом, дерево зависимостей будет выглядеть примерно так:

  • Приложение (C # .exe)
    • LibWrapper (C ++ / CLI .dll)
      • CoreLib (C ++ .lib)
        • libjpeg (C .lib)
        • libpng (C.lib)
        • ... намного больше библиотек

Чтобы все было хорошо и аккуратно, я бы хотел, чтобы LibWrapper зависел только от CoreLib, а CoreLib ссылается на все его зависимости.Я настроил зависимости проекта соответственно, и все работает отлично при перестройке решения с нуля.Пока все хорошо.

Однако, когда я что-то изменяю в LibWrapper, а затем пытаюсь построить решение (и только LibWrapper перекомпилируется и связывается), компоновщик не выбирает вложенные зависимости (libjpegи другие), и, таким образом, выдает множество ошибок компоновщика.Это технически правильно, так как компоновщик не может найти символы, потому что он вообще не смотрит на вложенные библиотеки.Но почему он работает так, как ожидалось при перестройке всего?

Возможно, что-то с настройками зависимости библиотеки, но я не могу понять, что именно.Я мог бы добавить зависимости CoreLib в LibWrapper, но это выглядит некрасиво, ИМХО.

Для библиотек, от которых зависит CoreLib, я установил «Вывод справочной сборки» и «Связать зависимости библиотеки» в false.Для зависимости CoreLib в LibWrapper я установил для обоих значение true.

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

// NestedDependencies.h

#pragma once

// add nested dependencies
#pragma comment(lib, "libjpeg")
#pragma comment(lib, "libpng")
// more libs..

В зависимом проекте я включаю этот заголовок из stdafx.h (или другого центрального расположения):

// stdafx.h

#pragma once

#using <mscorlib.dll>
#include <vcclr.h>
#include <windows.h>
#include <atlbase.h>
// whatever else

// add nested dependencies
#include "CoreLib/NestedDependencies.h"

По крайней мере, это работает, хотя каждый в нашей команде должен помнить о добавлении строки в NestedDependencies.h всякий раз, когда добавляется зависимость библиотеки.Это нехорошо, но выполнимо.

Однако я бы все же предпочел лучшее решение.Кто-нибудь знает?

1 Ответ

0 голосов
/ 20 октября 2011

Измените Core.lib на DLL, в противном случае правильным подходом будет явное связывание всех зависимостей в LibWrapper.DLL, насколько я знаю.

В некоторой степени связано с , почему .

...