無法啓動程序 “E:\練習DLL程序\DLLtest\Debug\DLLtest.dll”

      最近嘗試這寫了一個DLL程序,基本上全部是按照書上的要求進行寫的,但還是出現了錯誤。我想着應該很正常吧,所謂“紙上得來終覺淺,絕知此事要躬行”。其中出現的錯誤就是“無法啓動程序 “E:\練習DLL程序\DLLtest\Debug\DLLtest.dll” ”。

       我覺得事先需要說明的一點是:DLLtest是我建的DLL項目,test是我建的需要用到動態鏈接庫DLLtest的項目 。

       碰到這個問題後第一個去問的就是百度,百度上給了一個說法是DLLtest項目build之後所生成的DLLtest.dll文件並沒有放到test.exe文件所在的文件夾裏面。但是我的是放進去了的,不過還是有問題。至於說爲什麼需要將DLLtest4.dll文件放到運行文件所在的文件夾,Visual C++ 2010 入門經典(第五版)給出了明確的解釋:當程序執行時,要使Windows爲程序查找並加載一個DLL,通常要把這個DLL放在Windows System32文件夾中。如果DLL不在這個文件夾中,那麼Windows將搜索包含可執行文件(這裏是test.exe文件)所在的文件夾。如果沒有找到,就會出現一個錯誤消息。

        言歸正傳,還是說這個問題是怎麼解決的吧。後來在我無意中將E:\練習DLL程序\DLLtest\Debug\DLLtest.dll添加到了test項目-屬性-配置屬性-連接器-輸入-附加依賴項。在連接的時候很顯然的出現了問題,因爲是應該把build之後的DLL項目Debug文件夾下DLLtest.lib文件夾添加到附加依賴項的。但是問題的報錯內容卻引發了我的思考,錯誤內容是:E:\練習DLL程序\DLLtest\Debug\DLLtest.dll : fatal error LNK1107: 文件無效或損壞: 無法在 0x2F0 處讀取。當我看到這個錯誤後我想不會是我的DLLtest項目的錯誤吧。。。。無論如何分爲兩種情況:第一是我程序寫的有問題。第二是文件確實無法正確的打開,至於原因是什麼我就不知道了。仔細檢查過自己的程序後發現沒有錯誤,後來百度一下。裏面也是衆說紛紜,關於是第一種情況的解決辦法是因爲在test項目的主程序中沒有加#pragma comment(lib,"WS2_32.LIB"),我寫的程序很簡單,就是簡單的字符串輸出,平常寫的程序就沒有添加#pragma comment(lib,"WS2_32.LIB"),我認爲錯誤應該不是在沒有添加上面那句話程序,結果試了試,確實還是不行。甚至還有的說是要加上這樣的代碼#pragma comment(lib,"E:\練習DLL程序\DLLtest\Debug\DLLtest.LIB")在test項目主函數之前。然後我又仔細的查看了Visual C++ 2010 入門經典(第五版),書中比沒有對此操作做介紹,而且在添加外部依賴項的時候,已經明確的給出了.lib文件的路徑,就像你需要調用printf()函數一樣,你只需要先#include “stdio.h”即可,相同的原理我想要調用我自己寫的DLL裏面的東西,也是應該只需要包含相應的頭文件就行了,即#include "DLLtest.h"。試驗之後發現上面說的加#pragma comment(lib,"E:\練習DLL程序\DLLtest\Debug\DLLtest.LIB")的方法也是錯誤的。然後就是第二種情況的,百度上有的說是因爲磁盤的問題,但是按照相應的說法改過之後還是不行。後來還有一種說法是,在解決法案-屬性-通用屬性-外部依賴項,將DLLtest項目設置爲test項目的外部依賴,但很顯然也不像是正解,因爲系統中那麼多DLL都不在當前解決方案裏面,沒有設置外部依賴項,不還是能夠調用嘛,不過話說回來,系統是系統的,可能有好多自己不知道的東西,所以試了試,結果還是不行。後來無意中看到了解決方案-屬性-通用屬性-啓動項目,竟然默認爲在此解決方案中中的第一個項目DLLtest。。。。。。但是我恍然大悟,錯誤原來是在這裏,.dll文件應該無法運行纔對(這句話是否正確有待考證)。然後在默認啓動項下將test項目設置爲默認啓動項就好了。

        ╮(╯▽╰)╭,其實這個錯誤很低級的,但是有的時候確實很難發現,希望能夠給那些學習DLL的菜鳥(本人就是)帶來一些幫助。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章