2013-07-12 17 views
5

sử dụng c + +nhận ngày và giờ biên dịch không có macro

Tôi biên dịch mã theo lịch tự động và cần sử dụng thời gian mã được biên dịch trong mã. Hiện tại tôi chỉ đang sử dụng các macro __DATE__, __TIME__ để có được ngày giờ biên dịch. Tuy nhiên, điều này làm cho các tệp nhị phân thay đổi ngay cả khi không có thay đổi nào đối với nguồn (macro sẽ tăng lên ở thời gian biên dịch), không tốt (tôi không muốn thiết lập nghĩ rằng nhị phân đã thay đổi nếu không có thay đổi nào vào nguồn).

Có thể nhận thời gian biên dịch mà không sử dụng bất kỳ phương tiện nào có thể khiến nguồn thay đổi không?

Cảm ơn

+0

Bên cạnh việc lưu nó trong một tệp bổ sung không phải là một phần của bản dựng, tôi không nghĩ rằng có thể ... – Nbr44

+2

Trong trường hợp đó, bạn có thể muốn làm cho hệ thống xây dựng của mình chỉ xây dựng nếu có bất kỳ thay đổi nào. Biên dịch lại chỉ vì lợi ích của biên dịch lại khi không có thay đổi đối với bất kỳ nguồn nào không có ý nghĩa nhiều. –

+2

(Lưu ý: Bạn nên chỉnh sửa bài đăng của mình và thêm backticks xung quanh tên macro: "' ... the \ '__DATE __ \', \ '__TIME __ \' macro ... '", bởi vì hiện tại chúng xuất hiện đậm và không có dấu gạch dưới) –

Trả lời

3

Tiêu chuẩn __DATE____TIME__ macro làm những gì bạn quan sát, trả lại một thời gian chuỗi phụ thuộc.

Nó phụ thuộc vào hệ thống (và có lẽ trình biên dịch) và đáng chú ý là hệ thống xây dựng (ví dụ như GNU make).

Một ý tưởng tốt có thể là liên kết trong một tập tin timestamp riêng biệt, một cái gì đó tương tự (trong make cú pháp)

timestamp.c: 
     date +'const char timestamp[]="%c";' > [email protected] 

program: $(OBJECTS) timestamp.c 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     rm -f timestamp.c 

Các timestamp.o sau đó sẽ được tái sinh và program của bạn sẽ được liên kết lại ở mọi make (vì vậy tạo chương trình thực sự sẽ thay đổi, nhưng hầu hết mã số-$(OBJECTS) làm cho biến số sẽ không thay đổi).


Hoặc, bạn có thể, ví dụ: đăng nhập bên trong một số tệp nhật ký cơ sở dữ liệu hoặc tệp văn bản vào thời điểm liên kết, ví dụ:

program: $(OBJECTS) 
     $(LINKER.cc) $^ -o [email protected] $(LIBES) 
     date +'[email protected] built at %c' >> /var/log/build.log 

(bạn có thể sử dụng logger thay vì date để có được điều đó ghi lại trong nhật ký hệ thống)

Sau đó, tạo ra program sẽ không thay đổi, nhưng bạn sẽ đã đăng ở đâu đó một xây dựng dấu thời gian. BTW bạn cũng có thể đăng nhập một số kiểm tra (ví dụ: $(shell md5sum program) trong cú pháp make) của chương trình nhị phân của bạn.

+0

Hmm, điều này sẽ không khiến tệp nhị phân kết quả thay đổi từ bản dựng sang xây dựng không? Vì tệp timestamp.c cũng sẽ thay đổi và tệp timestamp.0 sẽ được liên kết vào nhị phân? –

+0

Tôi cần phải làm cho nó để các tập tin nhị phân cuối cùng không thay đổi trừ khi đã có một sự thay đổi thực sự trong nguồn. –

+0

@ user1322488 Lấy đoạn mã makefile đầu tiên của mình, nhưng sau đó sửa đổi dòng timestamp.c bằng cách thêm một phụ thuộc. ví dụ. 'timestamp.c: $ (OBJECTS)' Điều này sẽ làm cho nó chỉ tạo lại timestamp.c khi nó lớn hơn bất kỳ đối tượng nào. –

0

Nếu bạn sử dụng thời gian biên dịch trong tệp nhị phân CỦA BẠN, thì bạn sẽ có thay đổi nhị phân. Có một số giải pháp, nhưng tôi nghĩ điểm chính là nếu bạn xây dựng lại các tập tin nhị phân một cách thường xuyên, nó thực sự chỉ nên được thực hiện nếu có thực sự một số thay đổi (hoặc cho hệ thống xây dựng hoặc mã nguồn). Vì vậy, hãy tạo một phần trong hệ thống xây dựng của bạn để kiểm tra xem có thay đổi hay không và không xây dựng bất kỳ thứ gì nếu không có bất kỳ thay đổi nào. Một cách đơn giản để làm điều này là kiểm tra xem "phiên bản mới nhất" trong hệ thống điều khiển phiên bản cho mã nguồn là gì. Nếu phiên bản mới nhất giống với phiên bản được sử dụng trong bản dựng trước, thì không cần phải xây dựng gì. Điều này sẽ giúp bạn tiết kiệm việc tạo các bản dựng giống hệt nhau (ngoài việc tạo dấu thời gian) và sẽ giải quyết vấn đề storgin __DATE____TIME__ trong tệp nhị phân.

0

Nó không rõ ràng với tôi những gì bạn muốn.Nếu đó là lần sửa đổi cuối cùng thời gian của tệp, việc nhận nó sẽ phụ thuộc vào hệ thống của bạn và hệ thống xây dựng : một cái gì đó như -D $(shell ls -l --time-style=long-iso $< | awk '{ print $7, $8 }') có thể được sử dụng trong trình biên dịch với GNU tạo dưới Linux, ví dụ . Nhưng tất nhiên, điều đó có nghĩa là nếu một tệp bao gồm là đã thay đổi, nhưng không phải là nguồn, thì giờ và ngày sẽ không phản ánh nó.