2013-02-10 3 views
0

Моя цель состоит в том, чтобы создать DLL и LIB файл поэтому я следующий this guide
1) Я создал новый win32 проект консольного приложения в VS, выбрали DLL в качестве «Тип приложения» и высыпал проекта
2) Я пытаюсь создать базу данных на C++. Поэтому у меня есть 5 заголовков с ТОЛЬКО объявлениями функций.
3) database.h мой главный заголовок, это выглядит следующим образом:C++ Visual Studio DLL файла

#ifdef DBDLL_EXPORTS 
#define DBDLL_API __declspec(dllexport) 
#else 
#define DBDLL_API __declspec(dllimport) 
#endif 
#ifndef __Database_H 
#define __Database_H 


#include "Table.h" 

class DBDLL_API Database { ... }; 
#endif 

4) Теперь только с заголовками, я пытался компиляции проекта. Он скомпилирован, но я не вижу DLL или Libs нигде в папке проекта. Как их создать?

+0

Путь по умолчанию для поиска файлов, кстати, является 'Debug \ x86'. – Cameron

ответ

3

Это связано с тем, что заголовки не скомпилированы - скомпилированы только файлы CPP (которые вытягивают заголовки - исходный файл и все заголовки, которые он втягивает, называют «единицей перевода», что фактически является (независимо от других ТУ)).

Таким образом, система сборки думает, что вы строите пустой проект и в этом случае ничего не генерирует. Обратите внимание, что даже если заголовки втянуты и скомпилированы, если какой-либо экспортированный символ на самом деле не упоминается, он может быть оптимизирован. В таких случаях вы получите (пустую) DLL, но не файл .lib (что может привести к ошибкам в строке, если у вас есть зависимые проекты, которые ищут этот .lib, прежде чем что-либо появится в DLL).

Вам необходимо создать несколько файлов CPP, которые реализуют функции, объявленные в заголовках. Если у вас есть все в заголовках и вообще не нужны какие-либо файлы CPP, тогда нет смысла иметь DLL! (Так как вы могли бы включать заголовки в любой другой проект, не нуждаясь в какой-либо другой зависимости.)

Наконец, ваш защитник (#ifndef ...) должен охватывать весь заголовок, включая макросы экспорта DLL, иначе вы в конечном итоге получите переопределение макросов предупреждения.

Я бы предложил использовать #pragma once вместо того, чтобы включать охранники, поскольку он прост и распознается почти всеми компиляторами. Я также поставил бы макрокоманду DLL в свой собственный заголовок (например, «dllmacros.h») и включил бы там, где это необходимо (это уменьшит дублирование).

Смежные вопросы