2013-02-10 69 views
0

我的目標是創建一個dll和lib文件所以我下面this guide
1)我創建了VS一個新的Win32控制檯應用程序項目,選擇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或庫。我如何創建它們?

+0

順便說一句,查找生成文件的默認路徑是「Debug \ x86」。 – Cameron 2013-02-11 00:07:29

回答

3

這是因爲頭文件沒有被編譯 - 只有CPP文件被編譯(拉入頭文件 - 一個源文件和所有頭文件被稱爲「翻譯單元」,這實際上是編譯(獨立於其他TU))。

所以,實際上,構建系統認爲你正在構建一個空的項目,在這種情況下什麼都不會產生。請注意,即使頭文件被引入並編譯,除非導出的符號實際上被引用,它可能會被優化。在這種情況下,你會得到一個(空的)DLL,但是沒有.lib文件(如果你有依賴項目在DLL中有任何東西之前尋找這個.lib,可能會導致錯誤。

您需要創建一些CPP文件來實現在頭文件中聲明的函數。如果你的頭文件中包含所有內容,並且根本不需要任何CPP文件,那麼就沒有必要擁有DLL了! (因爲你可以在任何其他項目中包含頭文件而不需要任何其他的依賴項)

最後,你的包含守衛(#ifndef ...)應該包含整個頭文件,包括DLL導出宏,否則你最終會得到宏重定義警告。

我會建議使用#pragma once而不是包括守衛,因爲它更簡單,幾乎每一個編譯器都能識別。我也將DLL宏宏放到它自己的頭文件中(例如「dllmacros.h」),並將它包含在需要的地方(這將減少重複)。

相關問題