2009-01-09 35 views
9

Tôi đang xây dựng một chương trình sử dụng plugin. Thật không may, liên kết động của khung plugin buộc RTL và VCL ra khỏi dự án EXE của tôi và vào các phiên bản BPL, và họ không có thông tin gỡ lỗi được kích hoạt.Tại sao đơn vị của tôi "được biên dịch bằng một phiên bản khác" của các tệp của riêng tôi?

Vì vậy, tôi đã xây dựng một khuôn khổ kiểm tra liên kết đến các plugin của tôi một cách tĩnh để tôi có thể thực sự nhìn thấy những gì tôi đang làm khi truy tìm mã. Nhưng bây giờ, mỗi khi tôi cố gắng biên dịch lại, tôi nhận được một lỗi: "đơn vị turbu_skills được biên dịch với một phiên bản khác của turbu_database.GDatabase"

Tôi đã nhìn thấy lỗi này trước đây, nhưng chỉ khi tôi đã thay đổi mọi thứ Tôi có lẽ không nên, giống như các thư viện RTL hoặc VCL. Tôi không hiểu tại sao nó làm điều đó với mã của riêng tôi. Các đơn vị turbu_skills và turbu_database đều là các đơn vị mà tôi đã viết. GDatabase là một biến singleton toàn cầu, có định nghĩa lớp tôi đã không thay đổi trong tuần. Bất kỳ thay đổi nào kích hoạt biên dịch lại gây ra lỗi này, ngay cả khi tôi chưa chạm vào bất kỳ thứ gì trong một trong các đơn vị.

Làm một bản dựng đầy đủ (SHIFT-F9) khiến nó biên dịch chính xác. Nhưng nếu sau đó tôi nhấn SPACE trong một đơn vị (bất kỳ đơn vị nào) và nhấn F9, tôi sẽ gặp lại lỗi. Điều gì đang xảy ra và làm cách nào để ngăn chặn nó? Điều này không xảy ra trong ứng dụng chính, chỉ có khung kiểm tra.

EDIT: Tôi có nguồn cho tất cả các đơn vị của mình. Xóa DCUs và các tệp tương tự không giúp ích gì. Sao chép toàn bộ dự án sang một máy tính khác, xóa tất cả DCU và việc xây dựng ở đó không có tác dụng. Có một xung đột khách quan, có thể tái tạo giữa bố cục chương trình của tôi và trình biên dịch, và tôi muốn loại bỏ nó.

Nguồn có thể được tìm thấy tại http://www.turbu-rpg.com/downloads/Turbu_source_setup.exe nếu có ai muốn thử nghiệm. Nó đòi hỏi Delphi 2009 với JVCL đã được cài đặt; gói cài đặt sẽ xử lý phần còn lại. Có thể có mã nguồn có sẵn sẽ giúp ai đó theo dõi điều này. Tôi chắc chắn hy vọng như vậy, bởi vì bất cứ nơi nào vấn đề là, nó vượt ra ngoài tôi. Vấn đề có thể được tìm thấy trong testing.exe và cũng trong turbu.exe trong turbu.groupproj.

CHỈNH SỬA 2: Hóa ra đây là một vấn đề chung về đơn vị chéo khác. Grr. Tôi quản lý để mã một workaround. Tôi chỉ hy vọng họ nhận được các vấn đề generics cố định sớm.

+2

Bạn có thể nên viết một câu trả lời với công việc xung quanh. Nó sẽ giúp người khác vấp ngã trên cùng một vấn đề. –

+0

Cảm ơn EDIT 2, tôi whish tôi có thể đến đây vài giờ lãng phí trước đó ... – Wodzu

+1

@Mason Wheeler - 12 câu trả lời khác nhau! NÓ LÀ ĐƠN GIẢN TUYỆT VỜI Có bao nhiêu người có (tất cả các loại) vấn đề liên quan đến đường dẫn tìm kiếm/thư viện. Embarcadero đã làm một công việc rất rất nghèo giải thích điều này! – Ampere

Trả lời

16

Lỗi "đơn vị được biên dịch bằng phiên bản khác ..." là một phiên bản gây phiền toái. Nó xảy ra trong một tình huống như dưới đây:

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

Cả hai đơn vị A và B sử dụng đơn vị C và đơn vị B sử dụng C. Đơn vị B và C được biên soạn và vì một lý do là nguồn gốc của đơn vị B là không có sẵn. Bây giờ Unit C được thay đổi (bất kỳ thay đổi nào sẽ được thực hiện và được biên dịch lại) Và dcu của đơn vị C khác với đơn vị C được sử dụng bởi đơn vị B, vì vậy đơn vị B cũng cần được biên dịch lại. Nhưng thật không may, nguồn không có sẵn để trình biên dịch bỏ cuộc.

Không hoàn toàn rõ ràng điều gì xảy ra với tình huống của bạn.

Bạn có khung kiểm tra liên kết đến các plugin. Vậy đơn vị X và Y phù hợp với đâu và bạn có nhận ra mẫu được hiển thị ở trên không?

Nhưng thực tế là một bản dựng hoàn chỉnh giải quyết được vấn đề là gợi ý theo hướng này. Và đây không phải là lần đầu tiên tôi nhìn thấy vấn đề với một phần biên dịch lại. Vì vậy, tôi luôn sử dụng phiên bản hoàn chỉnh.

+0

Vâng, nó không sử dụng bất kỳ tệp nào phù hợp với mẫu "đơn vị B" và không nằm trong DPR cho khung thử nghiệm, mặc dù "đơn vị B" có thể là chuỗi phụ thuộc của nhiều tệp. Tôi sẽ xem xét điều đó. –

1

Kiểm tra xem bạn không có tệp dcu cũ căng thẳng ở đâu đó trong thư mục nguồn.

+0

Không. Xóa tất cả các DCU không giúp được gì. –

4

Tôi ghét sự cố này. Tôi tìm thấy nó bật lên mọi lúc và sau đó và mặc dù nó âm thanh trong trường hợp của bạn có liên quan trực tiếp đến những gì bạn đang làm với plugin, tôi đã giải quyết điều này trong quá khứ bằng cách tìm và xóa tất cả dcus, bpls và dcps của các gói mà chúng tôi đã viết và sau đó xây dựng lại các gói.

+1

Tôi cũng ghét điều này! Cảm ơn gợi ý! –

0

Bạn đang sử dụng VCL đã sửa đổi chưa? Các đơn vị bạn tham khảo trong phần giao diện của bạn cũng xác định giao diện của bạn. Tôi khuyên bạn nên đảm bảo rằng bạn không có hai phiên bản khác nhau của bất kỳ đơn vị nào của bạn có cùng tên (bao gồm VCL/RTL) có thể được tham chiếu từ dự án của bạn. Có lẽ nó là một cái gì đó ngớ ngẩn khi biên dịch nền đang sử dụng một phiên bản khác của các đơn vị sau đó biên dịch đĩa. Vì vậy, chỉnh sửa nó sẽ kích hoạt trình biên dịch nền, sau đó sẽ làm hỏng đồng bộ hóa.

+0

Đó là một ý tưởng rất hay, nhưng đó không phải là vấn đề ở đây. –

1
  1. Tệp .dpr thực tế của bạn chứa tham chiếu đến phiên bản tệp .pas không chính xác.

    Chế độ xem> Trình quản lý dự án> mở rộng cây và kiểm tra đường dẫn của tất cả các đơn vị.

  2. Có một tập tin trùng lặp trong danh sách đường dẫn tìm kiếm, và phiên bản không chính xác được tìm thấy đầu tiên

+0

Thật không may, không. Đó là điều đầu tiên tôi kiểm tra. Trường hợp cụ thể này hóa ra là một trục trặc trong trình biên dịch, một trong nhiều lỗi khi làm việc với Generics. Tôi tìm thấy một cách để làm việc xung quanh nó. –

+0

Được rồi. Xin lỗi, bạn đời :) –

1

Để tham khảo trong tương lai, đơn giản chỉ trình biên dịch với các phiên bản mã nguồn của "đơn vị vấn đề" sửa lỗi này cho tôi (tức là thêm các thư mục chứa mã nguồn vào đường dẫn tìm kiếm).

1

Chắc chắn có điều gì đó lỗi với trình biên dịch. Tôi đã thấy rằng việc thay đổi thứ tự của các đơn vị trong mệnh đề sử dụng sẽ cho phép bạn có được "một biên dịch tự do". Sau đó, lỗi xảy ra và trở lại của bạn để xây dựng lại. :-(

0

Đối với tôi vấn đề là tôi đã cài đặt Delphi với các thành phần tối thiểu cần thiết Và khi tôi mở một dự án đã được biên dịch với cài đặt Delphi đầy đủ, nó đã xảy ra với tôi. Sao chép các tệp trong thư mục "Nguồn" trong Delphi thư mục cài đặt từ máy khác có cài đặt Delphi đầy đủ đã giải quyết được vấn đề của tôi

1

Trong trường hợp của tôi, tôi đã thêm vị trí của đơn vị "vấn đề" vào đường dẫn tìm kiếm của dự án của tôi miễn là nó có thể tìm thấy nó. , nếu bạn có nhiều phiên bản của tệp được đề cập, nó có thể làm phức tạp vấn đề ...

1

Đơn vị ppParameter được biên dịch với một phiên bản khác của ppRelatv. TppRelative:

Xóa tất cả .dcu trong thư mục chương trình/máy tính của bạn, sau đó biên dịch lại hoặc xây dựng lại. Sau đó, chương trình của bạn sẽ chạy tốt trở lại.

2

Điều này xảy ra với tôi rất thường xuyên khi tôi quên để thay đổi DPK xây dựng kiểm soát từ Rebuild khi cần thiết để explict xây dựng lại trong Options ... | Mô tả.

0

tôi vụ án và giải pháp:

  • chúng tôi đã có một ứng dụng chính mà xây dựng một tập tin exe và
  • một số dự án plugin mà xây dựng các file dll cho exe này
    (dự án dll cũng cần một số ứng dụng các file nguồn)

đôi khi biên dịch các tập tin dll là "được biên soạn với một phiên bản khác nhau" vấn đề xảy ra

vấn đề là:

  • dự án exe được thiết lập để tạo tất cả các tệp dcu trong một thư mục riêng biệt: ví dụ: App\DCUs
  • dự án dll có thư mục DCUs này trong đường dẫn tìm kiếm, nhưng cũng có một số thư mục nguồn của ứng dụng: ví dụ: App\Utils, App\Core, v.v.
  • do đó, khi bạn biên soạn dự án dll, một số tệp nguồn ứng dụng đã được biên dịch lại (có thể với phiên bản khác của các phụ thuộc khác):
    và kết thúc bằng 2 cùng một số *.pas tệp

giải pháp rất dễ dàng: xóa thư mục tìm kiếm của dự án dll.

3

Làm thế nào tôi giải quyết được 'con đường điên rồ' trong 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 
0

tôi chỉ có thông báo lỗi tương tự trong Delphi XE. Mine đã được giải quyết sau khi đóng Delphi, mở nó lại và biên dịch lại dự án của tôi.

Các vấn đề liên quan