Почему моя сборка проекта Visual C ++ .exe создает файлы .lib и .exp?

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

1> ------ Сборка началась: Проект: masksample, Конфигурация: Отладка Win32 ------
1> Компиляция ...
1> stdafx.cpp
1> Компиляция .. .
1> masksample.cpp
1> Компиляция манифеста в ресурсы ...
1> Связывание ...
1> ССЫЛКА: 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> ССЫЛКА: 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> Встраивание manifest ...
1> calibsample - 0 ошибок, 0 предупреждений
========== Сборка: 1 выполнено успешно, 0 не выполнено, 1 обновлено, 0 пропущено ==========

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


person neuviemeporte    schedule 12.05.2010    source источник


Ответы (2)


Немного поздно, но, может быть, этот совет кому-то пригодится.

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

В моем решении есть 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"
person Francesco    schedule 24.10.2010
comment
Ах да, я забыл сделать это в своем проекте ... спасибо за ответ - person Matt Montag; 10.12.2011
comment
Все это имеет смысл, но какова цель создания .exp и .lib для экспорта .exe? Как этот .exe можно использовать как .dll? - person All the Rage; 03.11.2018
comment
В моем случае .exp и .lib создавались, когда я запускал свой проект с использованием CUDA. Это заставило мой код экспортировать символ NvOptimusEnablement, чтобы указать драйверу Optimus выбрать графический процессор Nvidia при запуске этого .exe. Подробности см. На странице developer.download.nvidia.com/devzone/devcenter / gamegraphics / - person All the Rage; 03.11.2018
comment
И обратите внимание, что я диагностировал это, просматривая строки в файле .exp, чтобы узнать, какой символ экспортируется. - person All the Rage; 03.11.2018
comment
Подобно @AlltheRage, в моем случае это произошло из-за того, что я использовал какой-то сторонний код, который использует __declspec(dllexport) в качестве подсказки для графического драйвера. См. код BGF. - person jwd; 16.07.2020

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

person Jerry Coffin    schedule 12.05.2010
comment
Что значит экспортировать функции из исполняемого файла? - person neuviemeporte; 12.05.2010
comment
Так же, как вы экспортируете функции из DLL, вы также можете экспортировать их из исполняемого файла. - person Jerry Coffin; 12.05.2010
comment
Я не вижу, как мой исполняемый файл экспортирует какие-либо функции. Он полностью содержится в main (). - person neuviemeporte; 12.05.2010
comment
Я ничего не экспортирую, и vs также создает файлы lib и exp - person Icebone1000; 16.11.2012
comment
@ Icebone1000 Вы можете просто связать статическую библиотеку, которая скомпилирована (не связана) с помощью declspec-s (это может произойти, если библиотека может быть построена как статическая или динамическая, но определяющий управляющий препроцессор неправильно сконфигурирован). - person mlvljr; 29.11.2014