作者purpose (purpose)
看板C_and_CPP
標題Re: [問題] 如何用VC6連結VS2005的lib
時間Thu Aug 9 17:47:51 2012
※ 引述《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