Правильный способ создания DLL с несколькими проектами? - PullRequest
0 голосов
/ 13 октября 2009

Хорошо, поэтому я пытаюсь преобразовать некоторые проекты в DLL. Все это проекты Visual Studio 2008, и все они написаны на C ++.

У нас есть 9 различных проектов (все под 1 решение в Visual Studio 2008). E.g.:

RasterTools\
 RasterDataset.h
 RasterDataset.cpp
 Point.h
 Point.cpp
 <... insert like 50 more cpp files ...>

CoreTools\
 Image.h
 Image.cpp
 CoreUtilities.h
 CoreUtilities.cpp
 <... insert more ...>

<... insert 7 or more projects ...>

Теперь дело в том, что некоторые проекты используют классы других проектов. Например, Image.h использует Point.h, а CoreUtilities.h имеет некоторые функции для работы с точками. Как правильно создать библиотеку DLL, когда у вас есть несколько проектов, которые все переплетаются.

В основном мы хотим иметь следующее:

CoreTools.dll
RasterTools.dll
<other projects.dll>

Я понимаю, как правильно обрабатывать __declspec (dllexport) и dllimport через макросы. Но когда я пытаюсь построить, например, CoreTools.dll, я получаю ошибки компоновщика, где бы я ни использовал класс или функциональность, не содержащуюся в этом проекте. Например, при создании coreTools.dll я получаю ошибки компоновщика для любой из функций класса Point.

Как я могу справиться с этим?

EDIT

Я попробовал это, и в основном я заметил, что почти все флажки были недоступны, так как это приводит к круговым зависимостям. (

Ответы [ 3 ]

3 голосов
/ 13 октября 2009

Если щелкнуть правой кнопкой мыши проект, который выдает ошибки компоновщика, и выбрать «Зависимости проекта ...», вы увидите список всех других проектов в вашем решении.

Установите флажки рядом с проектами (DLL), с которыми необходимо связать, и Visual Studio автоматически свяжется с ним (и убедитесь, что зависимости построены раньше клиентов).

2 голосов
/ 13 октября 2009

Для каждой библиотеки, которую вы создаете, вы также должны создать LIB. Если проект B (B.DLL) ссылается на записи в проекте A (A.DLL), то сначала строится проект A, создаются A.DLL и A.LIB, затем проект B может добавить A.LIB в необязательные библиотеки ссылок для разрешения его ссылки. Затем C.DLL, который зависит от B.DLL, может включить в шаг ссылки B.LIB и т. Д. И т. Д.

По крайней мере, так происходит на очень низком уровне сборки / сборки. Dev environemnt может сделать все это под прикрытием для вас, если вы правильно выберете зависимости проекта, как предполагает leegent.

1 голос
/ 13 октября 2009

Если у вас есть циклические зависимости между вашими DLL, вам придется их разрешать, перемещая вещи так, чтобы вы получили многоуровневые DLL, причем каждая DLL на данном уровне использует только код с уровнями ниже.

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