コンピュータや音楽の事書いてます

c++Builder [ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::CLSID_ExcelApplication' が xxx から参照されています

Excel関連の処理のある、C++Builder 4.2 のプロジェクトをbcc32(従来のコンパイラ)からbcc32c(Clang)へ移行するときの話。
C++Builder -> プロジェクト -> オプション -> C++コンパイラ -> "従来のコンパイラ" を外した場合、Clangによるコンパイルに切り替わる。
これによってC++11に対応し、安全性の高い警告や新機能が使える。また、エラーメッセージなどが一般的なものに変わるので google などで検索しやすくなる。

しかしExcel関連の bcbofficexp.lib が
C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win32 (bcc32対応)(従来のコンパイラ)
にあり、
C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\win32c (bcc32c対応)(Clang)
には無い為にビルド時にリンクエラーが発生する。

[ilink32 エラー] Error: 未解決の外部シンボル '__InitExceptBlockLDTC' が C:\PROGRAM FILES (X86)\EMBARCADERO\STUDIO\19.0\LIB\WIN32\RELEASE\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル '_ThrowExceptionLDTC(void *, void *, void *, void *, unsigned int, unsigned int, unsigned int, unsigned char *, void *)' が C:\PROGRAM FILES (X86)\EMBARCADERO\STUDIO\19.0\LIB\WIN32\RELEASE\BCBOFFICEXP.LIB|Access_XP_srvr.cpp から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル '_vector_delete_ldtc_(void *, unsigned int, unsigned int, unsigned int, void *)' が C:\PROGRAM FILES (X86)\EMBARCADERO\STUDIO\19.0\LIB\WIN32\RELEASE\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル '_vector_new_ldtc_(void *, unsigned int, unsigned int, unsigned int, void *, unsigned int, void *)' が C:\PROGRAM FILES (X86)\EMBARCADERO\STUDIO\19.0\LIB\WIN32\RELEASE\BCBOFFICEXP.LIB|Excel_XP_srvr.cpp から参照されています

BCBOFFICEXP.LIB がbcc32(Borland)形式なのが原因なので
C:\Program Files (x86)\Embarcadero\Studio\19.0\source\ComServers\OfficeXP\bcbofficexp.cpp を bcc32c (Clang) でコンパイルし、BCBOFFICEXP.LIB を作ってみたが

[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::CLSID_ExcelApplication' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::IID__Worksheet' が C:\REPOS\xxx\OBJ\xxx.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::DIID_ExcelRange' が C:\REPOS\xxx\OBJ\xxx.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::DIID_WINDOW' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::DIID_Hyperlink' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::IID__Workbook' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::DIID_PivotTable' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています
[ilink32 エラー] Error: 未解決の外部シンボル 'Excel_xp::IID__Application' が C:\REPOS\xxx\OBJ\EXCEL_XP_SRVR.OBJ から参照されています

他にもたりない物がある。同じsourceフォルダを"Excel_xp"で検索したら、 excel_xp.cpp , excel_xp_srvr.cpp だ。
lib ファイルなんて作らなくても、プロジェクト内にオブジェクトがあれば良いわけだから、

C:\Program Files (x86)\Embarcadero\Studio\19.0\source\ComServers\OfficeXP に
bcbofficexp.cpp
excel_xp.cpp
excel_xp_srvr.cpp
が存在するので、これらをbcc32cでコンパイルするようにプロジェクトに追加すれば解決するのではないかと考えた。

RAD Studioのプロジェクトマネージャに3つのcppファイルをドラッグアンドドロップする。
f:id:neuromancer_sho:20220218031437p:plain

見事ビルドが成功し、Clang (C++11) 対応にすることができた。