2008年4月10日 星期四

[C++] LINK : fatal error LNK1104: cannot open file 'LIBCMT.lib'

想使用 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

沒有留言:

張貼留言