簡體   English   中英

為什么我的單位“使用不同版本編譯”我自己的文件?

[英]Why are my units “compiled with a different version” of my own files?

我正在構建一個使用插件的程序。 不幸的是,插件框架的動態鏈接迫使RTL和VCL退出我的項目EXE並進入BPL版本,並且它們沒有啟用調試信息。

所以我構建了一個靜態鏈接到我的插件的測試框架,這樣我就可以在跟蹤代碼時看到我正在做的事情。 但是現在,每次我嘗試重新編譯時,都會收到一個錯誤:“unit 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:原來這是另一個跨單位泛型問題。 格兒。 我設法編寫了一個解決方法。 我希望他們很快就能解決仿制葯問題。

錯誤“單元用不同版本的......編譯”是一個令人討厭的錯誤。 它發生在如下情況:

     +--------+
     | 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在哪里適合並且您是否認識到上面顯示的模式?

但是,完整構建解決問題的事實暗示了這個方向。 這不是我第一次看到部分重新編譯的問題。 所以我總是使用完整版。

我討厭這個問題。 我發現它時不時會彈出來,雖然聽起來與您使用插件的內容直接相關,但我過去通過查找和刪除軟件包的所有dcus,bpls和dcps解決了這個問題。我們已經編寫然后重建包。

我如何解決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

當我忘記根據需要Rebuild更改DPK Build控件Options ...中的 Explict rebuild時 ,這種情況經常發生在我身上。

為了將來參考,只需將編譯器指向“問題單元”的源代碼版本就可以解決這個問題(即將包含源代碼的文件夾添加到搜索路徑中)。

單位ppParameter是使用不同版本的ppRelatv編譯的。 TppRelative:

刪除程序文件夾/計算機中的所有.dcu,然后重新編譯或重新構建。 然后你的程序將再次運行良好。

絕對是編譯器的錯誤。 我發現改變uses子句中單位的順序將允許你進入“一個免費編譯”。之后,錯誤重新發生,你重新開始重建。 :-(

檢查源目錄中的某個地方是否有緊張的舊dcu文件。

在我的例子中,我將“問題”單元的位置添加到項目的搜索路徑中。 只要它能找到它,它就會編譯。 當然,如果您有相關文件的多個版本,可能會使問題復雜化......

  1. 您的實際.dpr文件包含對.pas文件的錯誤版本的引用。

    查看>項目管理器>展開樹並檢查所有單元的路徑。

  2. 搜索路徑列表中存在重復文件,並且首先找到不正確的版本

我的案例和解決方案:

  • 我們有一個主應用程序,它構建一個exe文件和
  • 一些為這個exe構建dll文件的插件項目
    (dll項目還需要一些應用程序源文件)

有時在編譯dll文件時“發生了不同版本的編譯”問題

問題是這樣的:

  • exe項目設置為在單獨的目錄中創建它的所有dcu文件:例如App\\DCUs
  • dll項目在搜索路徑中有這個DCU目錄,但也有一些應用程序的源目錄:例如App\\UtilsApp\\Core等。
  • 因此,當您編譯dll項目時,會再次編譯一些應用程序源文件(現在可能使用其他依賴項的不同版本):
    我們最終得到了2個不同的*.pas文件的dcu

解決方案很簡單:從dll項目的搜索路徑中刪除App\\DCUs目錄。

我在Delphi XE中只有相同的錯誤消息。 在關閉Delphi后再次打開並重新編譯我的項目后解決了我的問題。

您使用的是經過修改的VCL嗎? 您在界面部分中引用的單位也決定了您的界面。 我建議您確保沒有可能從您的項目中引用的任何具有相同名稱(包括VCL / RTL)的單元的兩個不同版本。 也許這是一個愚蠢的事情,因為后台編譯使用的是不同版本的單元,然后是磁盤編譯。 所以編輯它會觸發后台編譯器,后者會混淆同步。

對我來說問題是我用最少的必需組件安裝了Delphi。 當我打開一個用完整的Delphi安裝編譯的項目時,它發生在我身上。 從具有完整Delphi安裝的另一台機器處理Delphi安裝文件夾中“Source”文件夾中的文件解決了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM