(更新: 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
Windows コンテキストで x64 アーキテクチャ用にコンパイルする場合 (Microsoft のツールを使用するか、Microsoft 以外のツールを使用するかに関係なく)、呼び出し規則は 1 つだけです。ここで説明するものであるため、stdcall、thiscall、cdecl、fastcall などはすべて 1 つになります。そして同じ。
name mangling に関する記事も関連しています。
今私には理にかなっています。呼び出し規則が 1 つしかないため、名前のマングリングが不要であり、cdecl
X86 用にコンパイルする場合のように先頭にアンダースコアがありません。