想使用 make 的朋友, 可要注意了. 這個問題通常出現在 linker 找不到 libcmt.lib 這個檔. 只要給他這個檔的路徑. 通常就能解掉這個問題.
但是...
如果你在MinGW 環境下, 使用 make 搭配 cl (Microsoft C/C++ compiler)編譯你的程式碼. 你就會發現明明給了 LIBPATH, 就是沒辦法找到 libcmt.lib.
先解決問題再說
直接設定你的環境變數. [控制台] -> [系統] -> [進階] -> [環境變數]
LIB 內容為 "library 的路徑"
ex:
"H:\Program Files\Microsoft Visual Studio 8\VC\lib"
注意:
1. 有雙引號
2. 有磁碟符號.
完成.
解說:
MinGW32 環境下編寫 Makefile 編譯程式, 通常路徑與 Windows 的路徑不同, 並且要處理空白的問題.
假設產生一個由 myfile.c 與 library.lib 產生 mydLL.dll 檔,
你下的指令可能是這樣:
cl -I${SDK}/include -LD myfile.c library.lib -FemyDLL.dll
直接下指令, 很有可能會出現下面, 找不到 library 的情況.
LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'
make: *** [jni] Error 2
如果你加上 //LIBPATH: 指定 LIBCMT.lib 的目錄位置, 那麼如下:
cl -I${SDK}/include -LD myfile.c library.lib -FemyDLL.dll //link //LIBPATH:/h/Program\ Files/Microsoft\ Visual\ Studio\ 8/VC/
你會發現, 問題依然還是 LINK: fatal error.
已經給了 Path, 檔案總管也看了 LIBCMT.lib 就躺在裡面, 可是 make 就是找不到?
<正確答案>
cl -I${SDK}/include -LD myfile.c library.lib -FemyDLL.dll //link //LIBPATH:"H:\Program Files\Microsoft Visual Studio 8\VC\lib"
注意: 不是 :/h/Program\ Files/Microsoft\ Visual\ Studio\ 8/VC/
雖然, 在MinGW 的環境下, 長檔名與空白的設定需要用 unix 的方式, 但是因為這裡的 //link 是給 Link.exe 用的參數, 而 Link.exe 吃的是 Windows 長檔名的格式, 所以要餵給他標準 Windows 長檔名的 Path.
"H:\Program Files\Microsoft Visual Studio 8\VC\lib"
我的作法:
因為散佈原始程式與協同合作的關係, 所以凡是 Makefile 裡面用到的目錄都使用環境變數進行定義.
所以我在 [控制台] -> [系統] -> [進階] -> [環境變數] , 新增一個
LIB 變數, 內容設定為
"H:\Program Files\Microsoft Visual Studio 8\VC\lib" (注意: 要加刮號)
原來的 Makefile 就可以寫成一般形式, 像這樣:
cl -I${SDK}/include -LD myfile.c library.lib -FemyDLL.dll
make 會自己到 LIB 裡面去找相關的 library.
by Jing
沒有留言:
張貼留言