DelphiでLinux 64ビットプロジェクトをビルドすると、E2597エラーが発生し、ビルドに失敗する
問題
PAServer経由でUbuntu SDKのインポートし、単純なコンソールプロジェクトをビルドすると、以下のようなエラーが発生し、ビルドに失敗します。
MSBUILD : error E2597: E2597 C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\ld-linux.exe: error: cannot find -lgcc_s
MSBUILD : error E2597: C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\ld-linux.exe: error: cannot find -lc
MSBUILD : error E2597: C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\ld-linux.exe: error: cannot find -ldl
MSBUILD : error E2597: C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\ld-linux.exe: error: cannot find -lpthread
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::__malloc(NativeUInt): error: undefined reference to 'malloc'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::__free(void*): error: undefined reference to 'free'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::pthread_once(int&, void (*)()): error: undefined reference to 'pthread_once'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::pthread_key_create(unsigned int&, void (*)(void*)): error: undefined reference to 'pthread_key_create'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::dladdr(NativeUInt, dl_info&): error: undefined reference to 'dladdr'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::dlopen(char*, int): error: undefined reference to 'dlopen'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::dlclose(NativeUInt): error: undefined reference to 'dlclose'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::TlsSetValue(unsigned int, void*): error: undefined reference to 'pthread_setspecific'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\SysInit.o:SysInit:function Sysinit::__dbk_fcall_wrapper(): error: undefined reference to '_Unwind_Resume'
MSBUILD : error E2597: c:\program files (x86)\embarcadero\studio\22.0\lib\Linux64\release\Posix.Dlfcn.o:Posix.Dlfcn:function Posix::Dlfcn::dlclose(NativeUInt): error: undefined reference to 'dlclose'
MSBUILD : error E2597: C:\CK\RADServer\Linux64\Release\Unit1.o:Unit1:function Unit1::TEMSTestResource1::GetItem(Ems::Resourceapi::TEndpointContext*, Ems::Resourceapi::TEndpointRequest*, Ems::Resourceapi::TEndpointResponse*): error: undefined reference to '_Unwind_Resume'
c:\program files (x86)\embarcadero\studio\22.0\Bin\CodeGear.Delphi.Targets(407,5): error F2588: F2588 リンカ エラー コード: 1 ($00000001)
プロジェクト "Project1.dproj" 内のターゲット "_PasCoreCompile" のビルドが終了しました。 -- 失敗
プロジェクト "Project1.dproj" のビルドが終了しました。 -- 失敗
ビルドに失敗しました。
※上記は、Delphi 11でビルドした場合のエラーメッセージの例です。
解決
このエラーの原因は、Ubuntuの実行環境に必要なライブラリが不足していることに起因します。Ubuntuのインストール状況によってはビルドに必要な環境を満たしていないことがあります。
その場合は、必要なライブラリを手動でインストールする必要があります。
例えば、以下の手順を試してください。
- Ubuntuで必要なライブラリのインストール
- sudo apt install libqt4-dev
- sudo apt install g++-8-multilib
- PAServer経由でWindows環境にインポートしたLinux SDKを削除
- インポートしたlinux SDKは以下のパスに配置されます。
- (C:\Users\<ログイン名>\Documents\Embarcadero\Studio\SDKs)
- PAServer経由でLinux SDKを再インポート
- linux 64ビットプロジェクトを再ビルド