方法1: 選擇項目->屬性->預處理器->預處理定義, 增長:HYCOMMONWINAPI_EXPORTS
方法2:
就是在
#ifdef HYCOMMONWINAPI_EXPORTS
#define HYCOMMONWINAPI_API __declspec(dllexport)
#else
#define HYCOMMONWINAPI_API __declspec(dllimport)
#endif
前面增長 #define HYCOMMONWINAPI_EXPORTS
其實這兩種方法都是增長定義
方法3:在你的dll cpp文件中把
#define HYCOMMONWINAPI_EXPORTS
加在#include <接口文件.h>
的前面
方法4:右擊dll工程 -- 屬性,打開屬性頁,展開:配置屬性 -- C++ --預處理器,在預處理器定義的最後面填入:_AFXEXT,再次編譯則搞掂。
以上方法逐一試下,不知道能不能幫到你。另外這種問題最好去CSDN社區去問比較好,百度上牛X的人比較少,我就常常去CSDN。數據庫
很是鬱悶的是,這個問題在relaese dll時又會出現,並且,上面的第4種解決方式沒有做用,其它的幾種方式暫時不甚瞭解到底怎麼操做,由於第3種方法按它的作,出錯windows
--------------------------------------------------------------------------------------------------------多線程
VS2003 IDE中常見問題【轉】函數
VS2003 IDE 筆記
我在安裝Microsoft Visual Studio.Net的時候,老是出現這樣的提示:「安裝程序檢測到另外一個程序要求計算機從新啓動。必須從新啓動計算機後才能安裝Visual Studio.Net系統必備。系統從新啓動後,您須要從新啓動安裝程序。單擊「肯定」從新啓動。單擊「取消」退出安裝程序,之後再安裝。」而後我就單擊「肯定」從新啓動電腦,待系統啓動完畢後,從新啓動安裝程序,結果上述提示再次出現,又是從新啓動電腦,然而仍是這樣的提示,沒法安裝。請高手指點。
個人操做系統是WINXP SP2的,請問究竟是什麼緣由?
解決辦法:在註冊表刪除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\pendingfilerenameoperations 而後再裝就能夠!
項目:常規-》配置類型(.exe .dll .lib 生成文件 實用工具)
項目:system->子系統(windows console)
項目:C/C++-》預處理器-》與處理器定義(預約義一些宏,如:WIN32 _DEBUG _CONSOLE)
啓用擴展指令集:
項目:C/C++-》代碼生成(啓用加強指令集 2003支持SSE SSE2)
2007-6-28
這幾天vc2003的編譯輸出顯示的中文都是亂碼,搞得我真不爽。原來是上次作的控制檯命令程序修改了控制檯的代頁碼936(中文)=》437(西文)。
而且應用到全部的console窗口。
但爲何會影響到編譯的輸出就不得而知了。
2007-9-13
附加××目錄
頭文件目錄: 項目:C/C++ 》常規 》附加包含目錄
庫文件目錄: 項目:連接器 》常規 》附加庫目錄
設置輸出目錄:(和工做目錄)
項目:配置屬性 》連接器 》 導入庫 (如:$(OutDir)/cgloverd.lib )
項目:配置屬性 》常規 》輸出目錄 (如..\..\bin)
若是要更改輸出exe的名稱能夠這樣:
項目:配置屬性 》連接器 》輸出文件 (如:..\..\bin/文件名.exe)(即 輸出目錄/文件名)
這樣你能夠把全部共享的dll放在..\..\bin中,而後應用程序編譯連接後自動放到..\..\bin中以實現共享dll
(另外 若是出現以下錯誤:沒法啓動調試.沒法啓動程序「。。。」,系統找不到指定文件,就是由於未設置輸出文件,能夠如上添加輸出exe)
若是你要應用程序的目錄爲其所在的目錄(即 輸出目錄),就要設置
項目:配置屬性 》調試 》工做目錄 (值同於 輸出目錄(如:..\..\bin));
[好比加載資源,用到文件路徑,也是基於工做目錄的]
[這個可能在用 打開文件對話框有用,好比你設置 exe輸出到..\..\bin,那麼默認的工做目錄就和 exe所目錄不同,那麼你設置的 打開對話框的默認路徑
在..\..\bin 下的exe 和 你剛編譯連接即刻出現的exe 下是不同的 ,因此你設置 工做目錄 同 輸出目錄同樣,工做目錄設置對 你剛編譯連接即刻出現的exe 的工做目錄 產生了影響]
============================================================================
2007-10-8
設置pdb文件目錄(程序數據庫文件)
項目:配置屬性 》連接器 》調試 > 生成程序數據庫文件(如:$(IntDir)/$(ProjectName).pdb)其中 $(IntDir)爲中間目錄
============================================================================
2007-10-8
設置lib文件目錄(導出庫目錄)
項目:配置屬性 》連接器 》高級 >導入庫 (如:lib\cglover.lib)
============================================================================
2007-9-18
DLL,出現warning:「。。。」dll 連接不一致
緣由:項目:配置屬性 》C/C++ 》命令行 中的全部選項有指定 /D "CGLOVER_EXPORTS"(這裏環境自動指定的導出符號)
#ifdef LOVER_EXPORTS //這裏出錯 =》CGLOVER_EXPORTS
#define CG_EXPORT __declspec(dllexport)
#else
#define CG_EXPORT __declspec(dllimport)
#endif
2007-9-18
DLL, 出現連接錯誤:沒法打開文件「clock.def」
緣由:這裏的錯誤是clock.def的路徑錯誤,以至找不到。
解決: 項目:配置屬性 》連接器 》 輸入 》模塊定義文件:路徑/cglover.def
也能夠 項目:配置屬性 》連接器 》 命令行 》在附加選項中添加: /DEF: "路徑/clock.def"
2007-9-20
使用tinyxml.lib出現了與 一些 Runtime-lib 重定義的連接錯誤
緣由:我想多是 tinyxml不支持 多線程。
解決:項目:配置屬性 》C/C++ 》代碼生成運行時庫 改成 單線程(/ML).
也能夠採用 忽略指定庫(這裏爲多線程的庫):
項目:配置屬性 》連接器 》輸入》忽略指定庫 (如:msvcrt.lib(多線程DLL)
2007-9-20
當使用模塊定義文件(.def)時,
咱們會在.def中寫:( LIBRARY 導出的dll名)
但因爲在一個dll中只容許一個.def文件,因此咱們這時沒法區別對待 Debug和Release版DLL,由於這是導出的.lib文件中填寫的是.def指定的DLL名,
好比(MyD.lib 和 My.lib 中認定的都是.def定義的(My.lib),雖然咱們能導出MyD.dll和My.dll.
解決:將 LIBRARY後面的去掉(有省事 有實惠,幹嘛還要寫導出dll名呢)
==============================================================================================
2007-9-26
debug時出現連接錯誤:
libcpd.lib(xdebug.obj) : error LNK2019: 沒法解析的外部符號 __malloc_dbg ,該符號在函數 "void * __cdecl operator new(unsigned int,struct std::_DebugHeapTag_t const &,char *,int)" (
??2@YAPAXIABU_DebugHeapTag_t@std@@PADH@Z) 中被引用
libcpd.lib(_tolower.obj) : error LNK2001: 沒法解析的外部符號 __malloc_dbg
libcpd.lib(xdebug.obj) : error LNK2019: 沒法解析的外部符號 __free_dbg ,該符號在函數 "void __cdecl operator delete(void *,struct std::_DebugHeapTag_t const &,char *,int)" (
??3@YAXPAXABU_DebugHeapTag_t@std@@PADH@Z) 中被引用
並且當使用<fstream>時纔出現這個錯誤
另外使用Release時沒錯誤。
經檢查 項目 》 配置屬性 》C/C++ 》 代碼生成》運行時庫 》
發現 Debug時使用的是:單線程(/ML) Release時使用的也是:單線程(/ML)
將Debug的改成:單線程調式(/MLd)
好像是上次發現程序中使用的Tinyxml庫不支持 多線程運行庫 ,改成 單線程的運行庫,但debug的沒改成調試版本的
==============================================================================================
2007-9-26
輸出dll後可以讓你選擇測試程序,若要改成不使用,以下:
項目:配置屬性 》 調試 》 命令:中的 字符串 就指定了 測試程序 路徑名文件名,去掉便可。
==============================================================================================
vc6->vc7的系列問題及解決方法-1 zz2006-07-19 09:57最近因爲工做須要,把項目從vc6升級到vc7(vc.net2003)。升級過程遇到些問題,記錄於此。
1. 編譯時出現:WINVER not defined. Defaulting to 0X0501 (Windows XP and Windows .NET Server)
這個問題是由於沒有指定工程要使用的平臺SDK的版本。
Minimum system required Macros to define
Windows Server 2003 family _WIN32_WINNT>=0X0502
Windows XP _WIN32_WINNT>=0X0501
Windows 2000 _WIN32_WINNT>=0X0500
Windows NT 4.0 _WIN32_WINNT>=0X0400
Windows Me _WIN32_WINDOWS=0X0490
Windows 98 _WIN32_WINDOWS>=0X0410
Internet Explorer 6.0 _WIN32_IE>=0X0600
Internet Explorer 5.01, 5.5 _WIN32_IE>=0X0501
Internet Explorer 5.0, 5.0a, 5.0b _WIN32_IE>=0X0500
Internet Explorer 4.01 _WIN32_IE>=0X0401
Internet Explorer 4.0 _WIN32_IE>=0X0400
Internet Explorer 3.0, 3.01, 3.02 _WIN32_IE>=0X0300
解決辦法:
屬性,C/C++,命令行,附加項中添加 /D _WIN32_WINNT=0x0501 (由於我是在xp下工做的因此是0x0501)
2. Link時出現:LINK : warning LNK4075: 忽略」/EDITANDCONTINUE」(因爲」/INCREMENTAL:NO」規範)
這個問題是由於在vc6中,工程使用的增量編譯。
解決辦法:
屬性,連接器,常規,啓動增量連接 選擇 是(INCREMENTAL)
3. 編譯時出現:warning C4129: 「U」 : 不可識別的字符轉義序列
error C3847: 通用字符中的錯誤符號;必須使用十六進制數字
緣由:爲開發全球通用的應用程序,.NET Framework 使用 Unicode UTF-16(Unicode 轉換格式,16 位編碼形式)來表示字符。在某些狀況下,.NET Framework 在內部使用 UTF-8。引入通用字符名稱的格式是 \u#### 或 \U########。
解決辦法:
//#include MAKEPATH(MAIN_IMAGE_PATH, FunUtil\\Unit_star.txt)
#include 「..\\ImageData\\ML128160\\FunUtil\\Unit_star.txt」
4. 連接時出現:LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit 已經在 MSVCRTD.lib(MSVCR71D.dll) 中定義 等相似錯誤
緣由:
Run-Time Library
?Run-Time Library是編譯器提供的標準庫,提供一些基本的庫函數和系統調用。
咱們通常使用的Run-Time Library是C Run-Time Libraries。固然也有Standard C++ libraries。
CRun-Time Libraries實現ANSI C的標準庫。VC安裝目錄的CRT目錄有C Run-Time庫的大部分源代碼。 CRun-Time Libraries有靜態庫版本,也有動態連接庫版本;有單線程版本,也有多線程版本;還有調試和非調試版本。?動態連接庫版本:
/MD Multithreaded DLL 使用導入庫MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用導入庫MSVCRTD.LIB?靜態庫版本:
/ML Single-Threaded 使用靜態庫LIBC.LIB
/MLd Debug Single-Threaded 使用靜態庫LIBCD.LIB
/MT Multithreaded 使用靜態庫LIBCMT.LIB
/MTd Debug Multithreaded 使用靜態庫LIBCMTD.LIB若要使用此運行時庫 請忽略這些庫
單線程 (libc.lib) libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
多線程 (libcmt.lib) libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
使用 DLL 的多線程 (msvcrt.lib) libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib
調試單線程 (libcd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib
調試多線程 (libcmtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib
使用 DLL 的調試多線程 (msvcrtd.lib) libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib
解決方法:
屬性,連接器,輸入,忽略指定庫 libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib (這是我須要忽略的,你能夠根據你工程的實際狀況選擇。)