1

(警告: 長文を読んでください。この質問は、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\RS2732ビットライブラリパスにあります

  • そのフォルダーには、すべての DevExpress dcu が含まれています。特にcxBarEditItem.dcudxBar.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.pasPatchlibs にプルすると、エラーは別のユニットに (繰り返し) 伝播するだけです。

多くの回答を読んだにもかかわらず (注目すべき SO の質問:なぜ私のユニットは自分のファイルの「別のバージョンでコンパイルされているのですか?」 ) 、エラーが発生する理由と今回はそれを修正する方法がわかりません。インターフェイスの Uses セクションにあり
cxBarEditItem.pas、Uses 句にありますが、なぜ再コンパイルする必要があるのでしょうか?dxBarcxBarEditItem

もちろん、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 オプションの設定とコンテンツの関係。 次に、それらの設定をプロジェクトの設定と比較したところ、次の違いが見つかりました (無関係な行は削除されています)。PackagescxLibraryRS27.dprojdxBarRS27.dprojcxLibraryRS27
.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-}

いいえ、成功しません...

4

2 に答える 2