2011-02-02 51 views
6

Tôi đã mã hóa một tập lệnh tạo ra một tệp tiêu đề có các hằng số như phiên bản, thẻ svn, số bản dựng. Sau đó, tôi có một lớp học tạo ra một chuỗi với thông tin này.Cách giảm thiểu thời gian biên dịch trong C++

Vấn đề của tôi là như sau: Khi tệp được tạo trong mọi trình biên dịch, trình biên dịch phát hiện tiêu đề đã thay đổi và buộc biên dịch lại một số lượng lớn tệp. Tôi đoán rằng vấn đề là trong tình hình của tập tin tiêu đề. Dự án của tôi là một thư viện và tiêu đề phải nằm trong tệp tiêu đề "giao diện với thế giới" (nó phải được công khai).

Tôi cần một số lời khuyên để giảm thiểu thời gian biên soạn này hoặc để giảm các tệp buộc phải biên dịch lại.

+1

Trình biên dịch thường không "phát hiện" các tệp khác đã thay đổi và kích hoạt biên dịch lại. Đó là một tính năng cấp cao hơn, thường được thực hiện bởi IDE và/hoặc rõ ràng hơn trong chính hệ thống xây dựng (ví dụ: Make & co). – unwind

+0

@unwind: Bạn không đúng. Một số trình biên dịch có thể phát hiện. –

Trả lời

12

Trong tiêu đề ghi cái gì đó như:

extern const char *VERSION; 
extern const char *TAG; 
extern const char *BUILD_DATE; 

và tạo ra một c (hoặc.cpp) tệp sẽ chứa

const char *VERSION = "0.13"; 
const char *TAG = "v_0_13"; 
const char *BUILD_DATE = "2011-02-02 11:19 UTC+0100"; 

Nếu tập lệnh của bạn cập nhật tệp .c, chỉ tệp đó sẽ phải được biên dịch lại, nhưng các tệp bao gồm tiêu đề của bạn sẽ không.

+0

Cảm ơn bạn đã giải pháp tài liệu của bạn. Tôi rất hữu ích – Killrazor

4

Tạo các hằng số trong tệp triển khai.

Đảm bảo tiêu đề không bị thay đổi bởi tập lệnh của bạn.

3

Cách dễ nhất để giải quyết vấn đề này là không tạo các hằng số đó trong tệp tiêu đề. Thay vào đó, hãy thực hiện các hàm trong tệp tiêu đề nhận các giá trị này. Sau đó, đặt các giá trị trong một tệp cpp nhỏ, thực hiện các hàm đó. (Hoặc đặt chúng trong một tiêu đề CHỈ bao gồm trong tập tin cpp đó). Khi bạn biên dịch lại, chỉ một tệp sẽ cần phải được biên dịch lại.

Ngoài ra, bạn có thể tìm đến distcc để tăng tốc biên dịch nếu bạn có một vài máy để phụ tùng.

1

Nếu bạn muốn giữ nó như là một tiêu đề công cộng duy nhất, bạn có thể thêm một bước xây dựng trước đó mất tập tin tiêu đề công cộng của bạn và

  • lọc ra các chi tiết phiên bản, hoặc loại bỏ chúng hoặc thay thế chúng bằng một chuỗi cố định, vào bản sao tạm thời của tệp
  • di chuyển phiên bản này sang tiêu đề nội bộ của bạn chỉ khi nó đã thay đổi, tức là không sao chép tệp (+ cập nhật dấu thời gian) trừ khi phiên bản đã thay đổi

sau đó tạo tiền tố của bạn dẫn đầu từ tệp tiêu đề nội bộ này. Bạn vẫn có thể sử dụng tiêu đề công khai với các chi tiết phiên bản cho các tệp nguồn cần phiên bản.

Có một kịch bản được chuyển đổi trong các nguồn GCC mà bạn có thể mượn nếu bạn đang sử dụng unix hoặc bạn có thể sử dụng fc trong một tệp hàng loạt trên Windows.

1

Giải pháp hướng đối tượng:

Nói chung, bạn nên đặt những người này thường xuyên làm mới cnstants vào tệp cpp, chứ không phải h. Đặt chúng vào một lớp học. Nếu bạn đã có một lớp tạo một chuỗi và xuất bản nó theo một phương thức, tôi sẽ đặt tất cả các hằng số đó vào cùng một cpp và thêm một số phương thức công khai để truy cập chúng từ các tệp nguồn khác.

3

Nếu bạn đang sử dụng gcc, bạn có thể thử sử dụng ccache. nó lưu trữ đối tượng tập tin dựa trên một hash của đầu ra xử lý trước, như vậy sẽ không biên dịch lại trừ khi một sự thay đổi thực tế xảy ra

2

Một cách khác là để khai báo các giá trị liên tục như extern const double PI; trong một tiêu đề của bạn như "my_constants.h" và thêm một file cpp cho dự án với nội dung như sau:

#include "my_constants.h" 

const double PI = 3.1415926535; 

Sau đó giá trị thực tế sẽ chỉ có được biên dịch một lần và thay đổi giá trị chỉ yêu cầu biên dịch tệp đơn đó và liên kết lại dự án.

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