3

(更新: Hans の提案によると、の動作を改善するための提案link.exeがあります。そこにアカウントを持っている場合は、投票できます。)


わかりました、私はばかです。1 月に、自分のコンピューター、Win7 Pro 64 ビットに Oracle をインストールしました。64ビット版をインストールしました。昨日、MSVC Express を使用して、 とoci1.cに対して小さなテスト プログラムをコンパイルしてリンクしようoci.hとしましoci.libた。

cl /nologo /c /I%ORACLE_HOME%\oci\include oci1.c
link /nologo oci1.obj /LIBPATH:%ORACLE_HOME%\oci\lib\msvc oci.lib

私の試みは で失敗し続けましたLNK2019。これは、未解決の外部シンボル 'symbol' が関数 'function' で参照されていることを意味します。問題のシンボル ( _OCIEnvCreate) はもちろん によって提供されるoci.libため、リンカはそれを解決できるはずです。

私のコンパイラは 32 ビットのみであり、インポート ライブラリは 64 ビットであるため、機能しないことが最終的にわかりました。あなたがばかで、知らないか覚えていない場合は、dumpbinユーティリティを使用して確認できます。

$ dumpbin /headers %ORACLE_HOME%\oci\lib\msvc\oci.lib | head
File Type: LIBRARY
FILE HEADER VALUES
        8664 machine (x64)

$ dumpbin /headers oci1.obj | head
File Type: COFF OBJECT
FILE HEADER VALUES
         14C machine (x86)

ここまでは順調ですね。しかし、私は時間を無駄にしたので、その経験を繰り返さないようにしたいと思います.

間違いではありませんが、LNK2019エラー メッセージから正しい方向に進むことはできません。異なる CPU アーキテクチャのバイナリをリンクしようとしているという警告はありません。

X64 アーキテクチャを指定すると、X86 バイナリを指定したという警告が表示されることに注意してください。

$ link /machine:x64 /nologo oci1.obj /LIBPATH:%ORACLE_HOME%\oci\lib\msvc oci.lib
oci1.obj : fatal error LNK1112:
Modul-Computertyp "X86" steht in Konflikt mit dem Zielcomputertyp "x64".

ただし、X86 アーキテクチャを明示的または暗黙的に指定する場合、そのような正確な警告はありません。

$ link /machine:x86 /nologo oci1.obj /LIBPATH:%ORACLE_HOME%\oci\lib\msvc oci.lib
oci1.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol
  "_OCIEnvCreate" in Funktion "_main".
oci1.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.

/VERBOSE スイッチをlink.exeに見つけました。これを使用すると、64 ビットにシンボルが見つからないことがわかりますoci.lib

リンクプロセスをより簡単にするためにオンにできる他のオプションはありますか?


更新:Hans の回答によるとdumpbin、32 ビットのインポート ライブラリで実行したところ、名前は次のように表示されます。

$ dumpbin /exports D:\Opt\MySQL5.5\lib\libmysql.lib
_load_defaults
_myodbc_remove_escape@8
_mysql_affected_rows@4
_mysql_autocommit@8
_mysql_change_user@16
_mysql_character_set_name@4

ここで扱っている 64 ビット OCI インポート ライブラリの名前は装飾されていないように見えます。

OCIXmlDbFreeXmlCtx
OCIXmlDbInitXmlCtx
ORLRconNativeInt
ORLRvalNativeInt
OraCoreIsPhysicalRawFile
OraMemAlloc

X86 呼び出し規約に関するウィキペディア:

Windows コンテキストで x64 アーキテクチャ用にコンパイルする場合 (Microsoft のツールを使用するか、Microsoft 以外のツールを使用するかに関係なく)、呼び出し規則は 1 つだけです。ここで説明するものであるため、stdcall、thiscall、cdecl、fastcall などはすべて 1 つになります。そして同じ。

name mangling に関する記事も関連しています。

今私には理にかなっています。呼び出し規則が 1 つしかないため、名前のマングリングが不要であり、cdeclX86 用にコンパイルする場合のように先頭にアンダースコアがありません。

4

1 に答える 1

1

バイナリの互換性を確認するに、シンボルが見つからないという不平を言うだけだと思います。x64 には呼び出し規約がないため、x64 シンボルには先頭のアンダースコアがありません。Microsoft インポート ライブラリを使用しない限り、シンボルはまったく装飾されません。

しかし、最初に互換性エラーを取得する方がはるかに生産的であることに、私は非常に同意します。それを実装するのがどれほど難しいかわかりません。知っていて、そのように機能させることができる人に尋ねて、connect.microsoft.com に機能要求を投稿してください。

于 2011-10-29T12:54:57.047 に答える