看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《WSzc (WSzc)》之銘言: : 大家好 : 因為需要與其他程式整合的關係 : 我需要用VC6連結一個open source的libs : 這些libs是VS2005的project所產生 (含source code 我有自行重新build產生) : 我google查了很久 : 但目前build還是會有很多warning跟1個error: : error LINK2001: unresolved external symbol _imp__iob_func : lib確定可以用 因為我用VS2005的project去call他 一切正常 : 但用一模一樣的code的VC6 project就會link error : 在link上的設定 我都盡量跟VS2005一樣 有些VC6沒有的我就沒辦法改 : 這個error看起來很像是run-time library:/MD /MT沒有設對 : 但我檢查 VC6跟VS2005都是設 /MDd : 不知為何 請問有人知道可能是什麼問題嗎? 謝謝 我沒有足夠的環境重現、除錯你的問題,但以下是我的推論。 假設有原始碼 vc10.c 且其內容如下: #include <stdio.h> int main() { FILE *fp = __iob_func(); printf("%p\n", fp); return 0; } 我使用 Visual Studio 2010 命令提示字元 (32位元) 處理 cl /MDd vc10.c 得到 vc10.exe 與 vc10.obj,執行該程式,可正常運作: D:\Desktop>vc10.exe 672CF498 此時我們檢驗 vc10.obj 的符號表: D:\Desktop>dumpbin /all vc10.obj > 11.txt 在 11.txt 中搜尋 __iob_func 可以找到以下內容: COFF SYMBOL TABLE 000 00AA9D1B ABS notype Static | @comp.id 001 00000001 ABS notype Static | @feat.00 002 00000000 SECT1 notype Static | .drectve Section length 30, #relocs 0, #linenums 0, checksum 0 004 00000000 SECT2 notype Static | .debug$S Section length 64, #relocs 0, #linenums 0, checksum 0 006 00000000 SECT3 notype Static | .data Section length 4, #relocs 0, #linenums 0, checksum 39F2DFD6 008 00000000 SECT3 notype Static | $SG2747 009 00000000 SECT4 notype Static | .text Section length 25, #relocs 3, #linenums 0, checksum E184D9FF 00B 00000000 SECT4 notype () External | _main 00C 00000000 UNDEF notype External | __imp__printf 00D 00000000 UNDEF notype External | __imp____iob_func 由此可以推論,對於 VC2010 編譯器來說,要 implicit link 這 __iof_func 與 printf 都必須將函數名稱先修飾加上 __imp__ 這 prefix。 顯然這與 原PO 所指出的 _imp 前綴詞相異。 所以,若用 VC6 連結器,或許可以找到 _imp__iob_func 符號, 反之,若用 VC2010 連節器,則只能找到 __imp____iob_func 符號。 讓我們繼續看下去... 同樣打開命令提示字元,準備觀察連結過程,執行 cl /MDd vc10.c /link /verbose > 22.txt 打開 22.txt 還是搜尋 iob_func 可以找到以下內容: vc10.c Microsoft (R) Incremental Linker Version 10.00.40219.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:vc10.exe /verbose vc10.obj 正在開始第一次階段 已處理 /DEFAULTLIB:MSVCRTD 已處理 /DEFAULTLIB:OLDNAMES 正在搜尋程式庫 正在搜尋 MSVCRTD.lib: 找到 __imp__printf 已在 vc10.obj 中參考 已載入 MSVCRTD.lib(MSVCR100D.dll) 找到 __imp____iob_func 已在 vc10.obj 中參考 已載入 MSVCRTD.lib(MSVCR100D.dll) 所以在 VC2010 環境下,其 MSVCRTD.lib 檔案可以找到原 PO 缺少的符號。 同樣檢驗該檔案的符號表: dumpbin /all msvcrtd.lib > 33.txt 可以發現以下內容: Search "iob_func" (7 hits in 1 files) D:\Desktop\33.txt (7 hits) Line 782: 42584 ___iob_func Line 783: 42584 __imp____iob_func Line 6407: 185 ___iob_func Line 7202: 185 __imp____iob_func Line 17264: Symbol name : ___iob_func Line 17268: Name : __iob_func Line 126344: ___iob_func 反正結論就是不會有原PO需要的 _imp__iob_func 符號就對了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.8.128.194
mida:大推~~~這篇值得m起來,專業!!!! 08/09 18:45
mida:自從.net出現後,VS的lib已經和VC6差很大了,建議還是要花點 08/09 18:46
mida:時間將VC6的code直接移植到新的VS上面compile,個人是覺得這 08/09 18:47
mida:樣還快一些~~~ 08/09 18:47
WSzc:感謝回答 我必須說明一下 很抱歉底線的數量我只是打個大概 08/09 19:48
WSzc:也就是 實際上應該就是__imp____iob_func 是我有點簡略的打了 08/09 19:49
WSzc:我目前的做法是重新將source code在VC6下compile 之前不直接 08/09 19:50
WSzc:這麼做的原因是 總共有3x個lib 然後又都有很多不同的設定跟 08/09 19:51
WSzc:link 所以希望直接在VS2005的project更改設定 就可以拿來用 08/09 19:52
WSzc:不過目前compile到第三個lib 我發現有些像是DWORD_PTR這種變 08/09 19:53
WSzc:數 在VC6不認得 VS2005可以 所以看來程式內容還是得做更動 08/09 19:54
WSzc:至於您說的MSVCRTD.lib這個應該就是/MDd就會load的lib 我也是 08/09 19:55
WSzc:覺得有load這個lib應該就不會出現這個error 所以很疑惑 08/09 19:56
purpose:你就跟我一樣,對 msvcrtd.lib 做 dumpbin 搜尋看看 08/09 21:37
purpose:我這邊資訊不足,比較難猜到真實狀況 08/09 21:37
ericinttu:強大的一篇 08/09 21:46