(警告: 長文を読んでください。この質問は、F2051 に関する他の多くの質問を参照しています)
ソース ツリーに PatchLibs という名前のフォルダーがあり、そこにサード パーティ ソースの変更されたファイルを置きます。
これはプロジェクトの検索パスにあります。..\Skin;..\PatchLibs
私はファイル dxBar.pas を DevExpress コントロールから Patchlibs にコピーし、実装セクションの一部のコードのみを変更しました。
さて、ビルドすると(すべてのローカル.dcu
ファイルが削除され、「クリーンアップ」されます)、悪名高いものになります:
[dcc32 Fatal Error] F2051 Unit cxBarEditItem was compiled with a different version of dxBar.TdxBarItemControl.GetItem
コード行を参照しません。コンパイルを開始すると、メッセージが表示されます。
構成:
新しい VM にインストールされた新しい Delphi および DevExpress バージョン。プログラムソースツリーをコピーしました。
C:\DelphiLibs\DevExpress\VCL\Library\RS27
32ビットライブラリパスにありますそのフォルダーには、すべての DevExpress dcu が含まれています。特に
cxBarEditItem.dcu
、dxBar.dcu
($(DXVCL)\Library\RS27\Win64
ライブラリ パスもそうですが、これは Win32 アプリです)cxBarEditItem.dcu
どこにも他に出現するものはありません。dcBar.pas
そしてcxBarEditItem.pas
入っていますc:\DelphiLibs\DevExpress\VCL\ExpressBars\Sources\
(すべての cx*.* および dx*.* ファイルのディスクをスキャンしました)。そのソース フォルダは、ブラウジング パスにも存在します (
$(DXVCL)\ExpressBars\Sources
)これらは単なるユニットです(対応する
.dfm
ファイルはありません)Patchlibs には、問題のない他の変更された DevExpress ファイルがあります。そして、私が同じ問題を抱えているものがいくつかあります(だけではありません
dxBar
)。.dcu
プロジェクトは、ソースの横にファイルを配置するように設定されてい.pas
ます (ユニットの出力ディレクトリは空白です)DevExpress ファイルはプロジェクトの一部ではありません
プロジェクト内の他のソース ファイルが変更されました
のコピーをcxBarEditItem.pas
Patchlibs にプルすると、エラーは別のユニットに (繰り返し) 伝播するだけです。
多くの回答を読んだにもかかわらず (注目すべき SO の質問:なぜ私のユニットは自分のファイルの「別のバージョンでコンパイルされているのですか?」 )
、エラーが発生する理由と今回はそれを修正する方法がわかりません。インターフェイスの Uses セクションにあり
cxBarEditItem.pas
、Uses 句にありますが、なぜ再コンパイルする必要があるのでしょうか?dxBar
cxBarEditItem
もちろん、DevExpress のソース コード ディレクトリを検索パスに追加することもできますが、多くのディレクトリがあり、それらのディレクトリにも.dcu
ファイルが作成されます。実際の問題を覆い隠しており、以前の Delphi/DevExpress セットアップではこれは必要なかっ
たので、私はそれをしないことを好みます:
以前の Delphi 10.3 の 32 ビット ライブラリ パス:
c:\DelphiLibs\CompanyName
c:\DelphiLibs\CompanyName\TTLib
c:\DelphiLibs\CompanyName\DataFox
C:\DelphiLibs\RBuilder\Source
$(BDSLIB)\$(Platform)\release
$(BDSUSERDIR)\Imports
$(BDS)\Imports
$(BDSCOMMONDIR)\Dcp
$(BDS)\include
c:\delphilibs\multilizer\localizationcomponentsxex_x86\packages\full\bplxe\20.0
C:\DelphiLibs\Multilizer\LocalizationComponentsXEx_x86
c:\delphilibs\pascal script\dcu\d25\win32
C:\DelphiLibs\Pascal Script\Source
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Dcu\D26\Win32
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\DataSnap
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\ZLib
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\Synapse
$(Everwood)\Bin
C:\DelphiLibs\Scalabium\SMExport\Sources
C:\DelphiLibs\Scalabium\SMImport\Sources
C:\DelphiLibs\Cooltray
C:\DelphiLibs\PlusMemo\
C:\Delphilibs\RBuilder\Lib\Win32
C:\DelphiLibs\PlusMemo
C:\DelphiLibs\IPWorks 2020 Delphi Edition\pas
C:\DelphiLibs\IPWorks Auth 2020 Delphi Edition\pas
C:\DelphiLibs\IPWorks Encrypt 2020 Delphi Edition\pas
C:\DelphiLibs\IPWorks SSH 2020 Delphi Edition\pas
C:\DelphiLibs\IPWorks ZIP 2020 Delphi Edition\pas
C:\DelphiLibs\VirtualUI\dev\Delphi
c:\DelphiLibs\CEF4Delphi-master\source\
$(DXVCL)\Library\RS26
Delphi 10.4 の 32 ビット ライブラリ パス:
c:\DelphiLibs\CompanyName
c:\DelphiLibs\CompanyName\TTLib
c:\DelphiLibs\CompanyName\DataFox
C:\DelphiLibs\RBuilder\Source
c:\program files (x86)\embarcadero\studio\21.0\lib\Win32\release
C:\Users\Jan\Documents\Embarcadero\Studio\21.0\Imports
c:\program files (x86)\embarcadero\studio\21.0\Imports
C:\Users\Public\Documents\Embarcadero\Studio\21.0\Dcp
c:\program files (x86)\embarcadero\studio\21.0\include
c:\delphilibs\plusmemo
C:\DelphiLibs\RBuilder\Lib\Win32
C:\DelphiLibs\Multilizer\LocalizationComponentsXEx_x86
C:\DelphiLibs\PlusMemo
C:\DelphiLibs\Pascal Script\Source
C:\DelphiLibs\Scalabium\SMExport\Sources
C:\DelphiLibs\Scalabium\SMImport\Sources
C:\DelphiLibs\Cooltray
C:\DelphiLibs\VirtualUI\dev\Delphi
C:\DelphiLibs\nSoftware\IPWorks 2020 Delphi Edition\pas
C:\DelphiLibs\nSoftware\IPWorks Auth 2020 Delphi Edition\pas
C:\DelphiLibs\nSoftware\IPWorks SSH 2020 Delphi Edition\pas
C:\DelphiLibs\nSoftware\IPWorks ZIP 2020 Delphi Edition\pas
C:\DelphiLibs\nSoftware\IPWorks Encrypt 2020 Delphi Edition\pas
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Dcu\D27\Win32
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\DataSnap
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\Grijjy
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\Synapse
C:\DelphiLibs\RemObjects Software\RemObjects SDK for Delphi\Source\ZLib
C:\Program Files (x86)\RemObjects Software\Everwood\Bin
C:\DelphiLibs\SQLDirect\Source
C:\DelphiLibs\CEF4Delphi-master\source
C:\DelphiLibs\DevExpress\VCL\Library\RS27
最後の1つを上下に移動したり、変更したりして$(DXVCL)\Library\RS27
も役に立ちませんでした
これらの 5 つの Embarcadero 行は奇妙に見えます (この SO の質問を参照してください。古い対応する行に置き換えました (そして、Embarcadero に報告しました)。問題に変化はありません。
追加の調査/失敗した試み
Ian Boydは、2014 年に非常によく似た問題を抱えていました
。そこでのDavidの答え
に
基づいて、試してみることにしました。私の状況は少し異なりました.DevExコードをビルドするときに使用されたコンパイラ設定を見つけて、変更した.dxBar.pas
DevExpress インストールのサブフォルダーに2 つの.dproj
ファイルがあることに気付きました:および(要ところで)
テスト プロジェクトのすべてのコンパイラ オプションをデフォルト以外に設定し、それをすべてのデフォルトと比較することで(ほとんど) 理解できました。 UI オプションの設定とコンテンツの関係。
次に、それらの設定をプロジェクトの設定と比較したところ、次の違いが見つかりました (無関係な行は削除されています)。Packages
cxLibraryRS27.dproj
dxBarRS27.dproj
cxLibraryRS27
.dproj
.dproj
cxLibraryRS27.dproj
彼らはこれを余分に持っていました:
<PropertyGroup Condition="'$(Base)'!=''">
<DCC_E>false</DCC_E> No idea what these are...
<DCC_F>false</DCC_F>
<DCC_K>false</DCC_K>
<DCC_N>false</DCC_N>
<DCC_S>false</DCC_S>
<DCC_DebugInformation>0</DCC_DebugInformation>
<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
<DCC_AssertionsAtRuntime>false</DCC_AssertionsAtRuntime>
<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
この余分なものがありました:
<PropertyGroup Condition="'$(Cfg_1)'!=''">
(this is the one with <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>)
<DCC_IntegerOverflowCheck>True</DCC_IntegerOverflowCheck>
<DCC_RangeChecking>True</DCC_RangeChecking>
<DCC_SYMBOL_DEPRECATED>False</DCC_SYMBOL_DEPRECATED>
<DCC_SYMBOL_LIBRARY>False</DCC_SYMBOL_LIBRARY>
<DCC_SYMBOL_PLATFORM>False</DCC_SYMBOL_PLATFORM>
<DCC_UNIT_LIBRARY>False</DCC_UNIT_LIBRARY>
<DCC_UNIT_PLATFORM>False</DCC_UNIT_PLATFORM>
<DCC_UNIT_DEPRECATED>False</DCC_UNIT_DEPRECATED>
<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
<DCC_COMBINING_SIGNED_UNSIGNED>false</DCC_COMBINING_SIGNED_UNSIGNED>
<DCC_COMPARING_SIGNED_UNSIGNED>false</DCC_COMPARING_SIGNED_UNSIGNED>
と
<PropertyGroup Condition="'$(Cfg_2)'!=''">
(this is the one with <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>)
<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
<DCC_DebugDCUs>true</DCC_DebugDCUs>
<DCC_WriteableConstants>True</DCC_WriteableConstants>
<DCC_IntegerOverflowCheck>True</DCC_IntegerOverflowCheck>
<DCC_RangeChecking>True</DCC_RangeChecking>
<DCC_SymbolReferenceInfo>2</DCC_SymbolReferenceInfo>
<DCC_StackSize>16384,9437184</DCC_StackSize>
<DCC_SYMBOL_DEPRECATED>False</DCC_SYMBOL_DEPRECATED>
<DCC_SYMBOL_LIBRARY>False</DCC_SYMBOL_LIBRARY>
<DCC_SYMBOL_PLATFORM>False</DCC_SYMBOL_PLATFORM>
<DCC_UNIT_LIBRARY>False</DCC_UNIT_LIBRARY>
<DCC_UNIT_PLATFORM>False</DCC_UNIT_PLATFORM>
<DCC_UNIT_DEPRECATED>False</DCC_UNIT_DEPRECATED>
<DCC_COMPARING_SIGNED_UNSIGNED>False</DCC_COMPARING_SIGNED_UNSIGNED>
<DCC_COMBINING_SIGNED_UNSIGNED>False</DCC_COMBINING_SIGNED_UNSIGNED>
そして彼らはこのPropertyGroupを持っていませんでした
<PropertyGroup Condition="'$(Cfg_2_Win32)'!=''">
<VerInfo_IncludeVerInfo>false</VerInfo_IncludeVerInfo>
<DCC_DebugInfoInExe>false</DCC_DebugInfoInExe>
<ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
<BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
<BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
<BT_BuildType>Debug</BT_BuildType>
<DCC_ImportedDataReferences>false</DCC_ImportedDataReferences>
<DCC_DebugDCUs>false</DCC_DebugDCUs>
</PropertyGroup>
これらを調べてみると、これらは設定が異なり、生成された.dcu
ファイルに影響を与える可能性があると思います。
範囲チェックオフ {$R-}
オーバーフロー チェックオフ {$Q-}
{$D-} オフのローカル デバッグ シンボル
ランタイム アサーション オフ {$C-}
シンボル参照情報オフ {$L-}
{$J-} オフの書き込み可能な定数
exe off {$Y-} のデバッグ情報
だから私はこれをの一番上に置きますdxBar.pas
:
{$C-,D-,J-,L-,Q-,R-,Y-}
いいえ、成功しません...