Почему моя сборка проекта Visual C ++ .exe создает файлы .lib и .exp? - PullRequest
18 голосов
/ 12 мая 2010

У меня есть решение, состоящее из 3 проектов. Одна из них - статическая библиотека, а две - консольные файлы .exe, которые зависят от этой библиотеки и ссылаются на нее. Их настройки кажутся идентичными. Я строю один из них:

1> ------ Начата сборка: Проект: образец маски, Конфигурация: Отладка Win32 ------
1> Компиляция ...
1> stdafx.cpp
1> Компиляция ...
1> masksample.cpp
1> Компиляция манифеста для ресурсов ...
1> Связь ...
1> LINK: C: \ Users \ DarekSz \ Praca \ cci \ Debug \ masksample.exe не найден или не создан по последней добавочной ссылке; выполнение полной ссылки
1> Встраиваемый манифест ...
1> masksample - 0 ошибок, 0 предупреждений
========== Построение: 1 выполнено, 0 не выполнено, 1 обновлено, 0 пропущено ==========

Тогда я продолжаю строить другое:

1> ------ Началась сборка: Проект: calibsample, Конфигурация: Отладка Win32 ------
1> Компиляция ...
1> stdafx.cpp
1> Компиляция ...
1> calibsample.cpp
1> Компиляция манифеста для ресурсов ...
1> Связь ...
1> LINK: C: \ Users \ DarekSz \ Praca \ cci \ Debug \ calibsample.exe не найден или не создан по последней добавочной ссылке; выполнение полной ссылки
1> Создание библиотеки C: \ Users \ DarekSz \ Praca \ cci \ Debug \ calibsample.lib и объекта C: \ Users \ DarekSz \ Praca \ cci \ Debug \ calibsample.exp
1> Встраиваемый манифест ...
1> калибровочный образец - 0 ошибок, 0 предупреждений
========== Построение: 1 выполнено успешно, 0 не выполнено, 1 обновлено, 0 пропущено ==========

Почему компоновщик на этот раз создает файлы .lib и .exp? Есть ли какая-нибудь опция для включения и выключения, которую я активировал, не зная об этом?

Ответы [ 2 ]

20 голосов
/ 24 октября 2010

Уже немного поздно, но, возможно, кто-то еще может найти полезную эту подсказку.

Кстати, я не гуру с ++ ...

В моем решении у меня есть 3 проекта. Один - это проект DLL, остальные - два проекта приложения Win32, ссылающиеся на проект DLL.

Обычно, когда ваша dll собрана, у вас также есть сгенерированный файл (.exp, .lib) также для проектов NON dll. Это может произойти при включении файла .h проекта dll в проект приложения, в котором содержится класс, помеченный символом __declspec (dllexport).

Чтобы компоновщик не думал, что вы пытаетесь включить некоторые файлы .h для «экспорта», используйте условное выражение для определения макроса _declspec.

Пример:

#if defined(_DO_NOT_EXPORT)
#define DllExport  
#else
#define DllExport __declspec(dllexport)
#endif

Хорошо, допустим, у вас есть MyClass.h в вашем проекте DLL.

в вашем .h файле, который вы могли бы теперь иметь:

class DllExport MyClass {
 ...
}

Если вы хотите включить этот файл .h в проект NON dll, вам просто нужно определить условие _DO_NOT_EXPORT

#define _DO_NOT_EXPORT
#include "MyClass.h"
3 голосов
/ 12 мая 2010

Это нормально, если одна или несколько функций экспортируются из вашего исполняемого файла.

...