Повторное использование объектных файлов в Visual Studio 2005 - PullRequest
2 голосов
/ 04 ноября 2008

Вот ситуация:

У меня есть одно решение VS2005 с двумя проектами: MyDll (DLL), MyDllUnitTest (консоль EXE).

В MyDll у меня есть класс MyClass, который является внутренним для DLL и не должен экспортироваться. Я хочу протестировать его в MyDllUnitTest, поэтому я добавил класс набора тестов под названием MyClassTest, где я создаю экземпляры MyClass и тестирую их.

Мой вопрос: как я могу связать объектный файл MyClass, созданный сборкой MyDll, с MyDllUnitTest EXE? Я не хочу создавать MyClass в MyDllUnitTest и не хочу экспортировать класс.

Я попытался использовать один и тот же Промежуточный каталог для обоих проектов (поэтому объектные файлы находятся в одном каталоге) и использовать функцию ссылок в VS2005 (проект правой кнопкой мыши -> Ссылки -> Добавить новую ссылку) ...), но это не сработало - я все еще получаю ошибку компоновки (LNK2001).

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

Редактировать: Я решил поместить файлы в оба проекта, поэтому они компилируются дважды. Оказывается, функция «Ссылка» работает автоматически - но только для статических проектов lib.

Ответы [ 5 ]

2 голосов
/ 04 ноября 2008

Я не понимаю, почему вы не хотите встроить его в свой проект DLL. Пока оба проекта используют один и тот же исходный файл, они оба будут генерировать один и тот же объектный файл (при условии, что параметры компилятора установлены одинаково).

Если вы хотите проверить dll без экспорта самого класса (я предполагаю, что это потому, что экспорт классов в dll обычно плохая идея), рассмотрите возможность экспорта функции "factory" из dll. Это будет иметь подпись, как:

extern "C" MyClass *CreateMyClass();

Эта функция создаст объект MyClass и вернет указатель на него. Ваш модульный тест может затем сделать все, что ему нужно, с возвращенным объектом класса.

1 голос
/ 06 августа 2012

Здесь я делаю дополнительный «фильтр» «Object Files» в проекте тестирования, наряду с «Header Files» и «Source Files», и помещаю туда все необходимые файлы .obj (что проще, если кстати, они уже созданы) Это, кажется, работает хорошо здесь. Мы также используем это для модульного тестирования здесь, и в некоторых местах для того, чтобы не нужно компилировать один и тот же исходный файл дважды при использовании его для двух разных DLL.

Одна из причин, по которой мы так поступаем, заключается в том, что мы используем CMake для генерации файлов нашего проекта и поэтому не можем использовать всю внутреннюю «магию» Visual Studio.

1 голос
/ 05 ноября 2008

Вот альтернативный подход для достижения того, что вы пытаетесь сделать, НО я верю, что он будет соответствовать вашим требованиям ...

Используйте атрибут InternalsVisibleToAttribute в сборке, содержащей классы, которые вы хотите проверить. Тогда, если вы обратитесь к этой сборке, вы сможете протестировать класс, даже если для других сборок эти типы являются «невидимыми». Магия!

Вот ссылка MSDN атрибута для использования ...

http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

0 голосов
/ 17 декабря 2011

Вы также можете попробовать использовать команду, которая генерирует .lib со всеми объектами.

Как и в ответе от: Ссылка Visual C ++ генерирует объекты из ссылочного проекта

0 голосов
/ 04 ноября 2008

Я думаю, вам также нужно явно добавить файл .obj в список дополнительных зависимостей в настройках компоновщика проекта.

...