12

プラグインを使用するプログラムを作成しています。残念ながら、プラグイン フレームワークの動的リンクにより、RTL と VCL がプロジェクト EXE から強制的に BPL バージョンに移動され、デバッグ情報が有効になりません。

そこで、プラグインに静的にリンクするテスト フレームワークを構築して、コードをトレースしながら自分が何をしているかを実際に確認できるようにしました。しかし今、再コンパイルしようとするたびに、「ユニット turbu_skills は異なるバージョンの turbu_database.GDatabase でコンパイルされました」というエラーが表示されます。

このエラーは以前にも見たことがありますが、RTL ライブラリや VCL ライブラリなど、変更すべきではないものを変更したときだけです。自分のコードでそれを行う理由がわかりません。turbu_skills ユニットと turbu_database ユニットは、どちらも私が書いたユニットです。GDatabase はグローバル シングルトン変数であり、そのクラス定義は何週間も変更していません。どちらのユニットにも何も触れていなくても、再コンパイルを引き起こす変更により、このエラーが発生します。

フル ビルド (SHIFT-F9) を実行すると、正しくコンパイルされます。しかし、ユニット (任意のユニット) でSPACEを押して F9 を押すと、再びエラーが発生します。どうすれば停止できますか? これはメイン アプリでは発生せず、テスト フレームワークでのみ発生します。

編集:すべてのユニットのソースがあります。DCU や同様のファイルを削除しても役に立ちません。プロジェクト全体を別のコンピューターにコピーし、すべての DCU を削除して、そこでビルドしても役に立ちません。プログラムのレイアウトとコンパイラーの間に客観的で再現可能な競合があり、それを取り除きたいと思っています。

ソースはhttp://www.turbu-rpg.com/downloads/Turbu_source_setup.exeで見つけることができます。JVCL がすでにインストールされている Delphi 2009 が必要です。残りはインストーラー パッケージが処理します。ソースコードを入手できると、誰かがこれを追跡するのに役立つかもしれません。問題がどこにあっても、それは私を超えているので、私は確かにそう願っています。この問題は、testing.exe と turbu.groupproj の turbu.exe で見つけることができます。

編集 2: これは別のクロスユニット ジェネリックの問題であることが判明しました。ぐら。回避策をコーディングすることができました。ジェネリックの問題がすぐに修正されることを願っています。

4

14 に答える 14

18

「ユニットは異なるバージョンの...でコンパイルされています」というエラーは厄介なものです。以下のような状況で発生します。

     +--------+
     | unit A |
     +--------+
      |      |
      |      |
      V      |
  +--------+ |
  | unit B | |
  +--------+ |
      |      |
      |      |
      V      V
     +--------+
     | unit C |
     +--------+

ユニットAとBの両方がユニットCを使用し、ユニットBはCを使用します。ユニットBとCはコンパイルされており、何らかの理由でユニットBのソースが使用できません。ここで、ユニットCが変更されます(変更が行われ、再コンパイルされます)。また、ユニットCのdcuは、ユニットBが使用するユニットCとは異なるため、ユニットBも再コンパイルする必要があります。しかし残念ながら、ソースが利用できないため、コンパイラーはあきらめます。

あなたの状況の何が悪いのかは完全には明らかではありません。

プラグインにリンクするテストフレームワークがあります。では、ユニットXとYはどこに収まり、上記のパターンを認識しますか?

しかし、完全なビルドが問題を解決するという事実は、この方向のヒントです。そして、部分的な再コンパイルで問題が発生したのはこれが初めてではありません。だから私はいつも完全版を使います。

于 2009-01-09T19:52:35.360 に答える
5

私はこの問題が嫌いです。時々ポップアップすることがわかります。あなたの場合、プラグインで行っていることに直接関係しているように聞こえますが、パッケージのすべての dcus、bpls、および dcp を見つけて削除することで、過去にこれを解決しました。書いてからパッケージを再構築します。

于 2009-01-12T00:49:55.087 に答える
4

Delphi XE7で「パスの狂気」をどのように解決したか:

  Rule1: Always separate the DCU from the PAS files

  Tools -> Option -> Library path: 
                 Path to global (3rd party) libraries (DCU folder) that never change.

                    c:\Delphi\Tools\FastMM\
                    c:\MyProjects\Packages\Third party packages\$(Platform)
                    c:\MyProjects\Packages\DragDrop\$(Platform)
                    c:\MyProjects\Packages\Graphics32\$(Platform)

  Project -> Options -> Search path: 
                 Path to personal libraries, that changes often. 
                 Enter the path to the DCU folder first, then path to PAS file. 
                 This way, the compiler will use the DCU files first, instead of recomilin every time from PAS files. 
                 It will recompile anyway if you do a Build.

                    c:\MyProjects\Packages\cCommonControls\$(Platform)_$(Config)
                    c:\MyProjects\Packages\cCommonControls\

  Project -> Options -> Output directory: 
                 Leave it empty so the exe file is generated in project's folder 

  Project -> Options -> DCU output directory: 
                 Use .\$(Platform)_$(Config) in order to enforce Rule1
于 2015-10-19T18:54:06.313 に答える
3

これは、DPKビルド コントロールを必要に応じてリビルドからオプション...|説明の明示的リビルドに変更するのを忘れたときによく起こります。

于 2013-09-02T21:35:03.947 に答える
1

将来の参考のために、コンパイラに「問題ユニット」のソースコードバージョンを指定するだけで、これが修正されました(つまり、ソースコードを含むフォルダを検索パスに追加します)。

于 2009-09-21T00:10:22.020 に答える
1

私の場合、「問題のある」ユニットの場所をプロジェクトの検索パスに追加しました。それを見つけることができる限り、コンパイルしました。もちろん、問題のファイルのバージョンが複数ある場合は、問題が複雑になる可能性があります...

于 2012-02-02T21:08:01.837 に答える
1

ソース ディレクトリのどこかに古い dcu ファイルが残っていないことを確認してください。

于 2009-01-10T11:06:36.793 に答える
1
  1. 実際の .dpr ファイルには、不適切なバージョンの .pas ファイルへの参照が含まれています。

    表示 > プロジェクト マネージャー > ツリーを展開し、すべてのユニットのパスを調べます。

  2. 検索パスのリストに重複ファイルがあり、間違ったバージョンが最初に検出されます

于 2009-05-28T00:13:56.733 に答える
0

私にとっての問題は、必要最小限のコンポーネントで Delphi をインストールしたことでした。そして、完全な Delphi インストールでコンパイルされたプロジェクトを開いたとき、それは私に起こりました。Delphi インストール フォルダの「ソース」フォルダにあるファイルを、Delphi を完全にインストールした別のマシンからコピーすると、問題が解決しました。

于 2011-01-04T08:00:57.950 に答える
0

変更された VCL を使用していますか? インターフェイス セクションで参照する単位によって、インターフェイスも決まります。プロジェクトから参照される可能性のある同じ名前 (VCL/RTL を含む) のユニットの 2 つの異なるバージョンがないことを確認することをお勧めします。バックグラウンド コンパイルでは、ディスク コンパイルとは異なるバージョンのユニットが使用されているため、ばかげている可能性があります。そのため、編集するとバックグラウンド コンパイラがトリガーされ、同期が台無しになります。

于 2009-01-12T17:05:34.557 に答える
0

間違いなくコンパイラにバグがあります。uses 句のユニットの順序を変更すると、「1 回の無料コンパイル」が可能になることがわかりました。その後、エラーが再発し、再構築に戻ります。:-(

于 2009-12-18T06:29:15.777 に答える
0

私のケースと解決策:

  • exeファイルを構築するメインアプリケーションがあり、
  • この exe の dll ファイルをビルドするいくつかのプラグイン プロジェクト
    (dll プロジェクトには、いくつかのアプリケーション ソース ファイルも必要です)

dll ファイルをコンパイルするときに、「別のバージョンでコンパイルされた」という問題が発生することがある

問題はこれでした:

  • exe プロジェクトは、すべての dcu ファイルを別のディレクトリに作成するようにセットアップされました。App\DCUs
  • dll プロジェクトでは、検索パスにこの DCUs ディレクトリがありましたが、アプリケーションのソース ディレクトリの一部もApp\Utils含まれていましたApp\Core
  • したがって、dll プロジェクトをコンパイルしたときに、一部のアプリケーション ソース ファイルが再度コンパイルされました (現在は、他の依存関係の異なるバージョンである可能性があります):同じファイル
    の 2 つの異なる dcu が作成されました*.pas

App\DCUs解決策は簡単です。dll プロジェクトの検索パスからディレクトリを削除します。

于 2015-01-13T18:30:39.943 に答える
0

Delphi XE でも同じエラー メッセージが表示されました。私の問題は、Delphi を閉じて再度開き、プロジェクトを再コンパイルした後に解決されました。

于 2017-03-06T09:21:40.893 に答える