2012-06-09 38 views
6

Chạy: phiên bản gcc 4.2.1 (Apple Inc. xây dựng 5664)Thời gian biên dịch chậm với Boost + GCC + header được biên dịch trước

Tôi đã tạo dự án XCode táo với tiêu đề mặc định được biên dịch trước. Dường như nó rất chậm và một tệp chính nhỏ với chức năng chính không bao gồm mã nào mất 6 giây để biên dịch, sau khi tôi nâng cấp lên ổ SSD mới. Tôi đang ở trên một máy tính xách tay, nhưng tôi đã đặt chỗ nâng cấp lên một máy trạm sẽ làm giảm bớt vấn đề của tôi. Nếu tôi tắt tiêu đề được biên dịch trước thì tệp chính sẽ biên dịch trong một giây. Có vẻ như sử dụng một tiêu đề được biên dịch trước sẽ đặt một hình phạt trên tất cả các tệp. Sự chậm trễ này khiến tôi muốn tránh biên dịch và thử nghiệm với mã không tốt. Dưới đây là những gì tôi bao gồm trong tiêu đề được biên dịch trước của tôi:

#pragma once 

#include <algorithm> 
#include <bitset> 
#include <complex> 
#include <deque> 
#include <fstream> 
#include <functional> 
#include <iostream> 
#include <istream> 
#include <iterator> 
#include <limits> 
#include <list> 
#include <locale> 
#include <map> 
#include <numeric> 
#include <ostream> 
#include <queue> 
#include <set> 
#include <sstream> 
#include <stack> 
#include <stdexcept> 
#include <streambuf> 
#include <string> 
#include <valarray> 
#include <vector> 

#include <boost/smart_ptr/scoped_ptr.hpp> 
#include <boost/smart_ptr/scoped_array.hpp> 
#include <boost/smart_ptr/shared_ptr.hpp> 
#include <boost/smart_ptr/shared_array.hpp> 
#include <boost/smart_ptr/make_shared.hpp> 
#include <boost/smart_ptr/weak_ptr.hpp> 
#include <boost/smart_ptr/intrusive_ptr.hpp> 

#include <boost/regex.hpp> 
#include <boost/thread.hpp> 
#include <boost/bind/bind.hpp> 
#include <boost/bind/apply.hpp> 
#include <boost/bind/protect.hpp> 
#include <boost/bind/make_adaptable.hpp> 

#include <boost/asio.hpp> 
//#include <boost/asio/ssl.hpp> 


#include <boost/property_tree/ptree.hpp> 
#include <boost/random.hpp> 
#include <boost/lexical_cast.hpp> 
#include <boost/date_time/gregorian/gregorian.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time/local_time/local_time.hpp> 
#include <boost/date_time/time_zone_base.hpp> 
#include <boost/circular_buffer.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/accumulators/statistics.hpp> 

Tôi chưa bao gồm tinh thần, điều này thực sự làm cho thời gian biên dịch tăng lên.

+0

Vì vậy, một "tệp chính nhỏ với một hàm chính không bao gồm không có mã" mất ít thời gian hơn nhiều để biên dịch hơn một dự án với tất cả các tính năng được liệt kê ở trên? Nên điều đó không được mong đợi? – jedwards

+0

Ngoài ra, sự hiểu biết của tôi về các tiêu đề biên dịch sẵn là chúng chỉ có xu hướng tiết kiệm thời gian biên dịch nếu không chúng sẽ được biên dịch nhiều lần, thông qua 'include' từ nhiều nguồn. Đây không phải là trường hợp của bạn, vì vậy tôi sẽ tưởng tượng thời gian biên dịch của bạn bằng cách sử dụng các tiêu đề biên dịch sẵn sẽ tương tự như không có. Đó là, bạn sẽ không nhận ra nhiều lợi ích bằng cách sử dụng các tiêu đề được biên dịch trước. Bạn thực sự nên hạn chế sự bao gồm của bạn vào những gì bạn cần trên cơ sở nguồn cụ thể của tập tin. – jedwards

+0

Và điều này có nghĩa là: "Sự chậm trễ này khiến tôi muốn tránh biên dịch và thử nghiệm mã không tốt". – jedwards

Trả lời

7

Các tiêu đề được biên dịch trước của GCC hoạt động theo cách rất cụ thể. Chỉ có thể sử dụng một tệp tiêu đề biên dịch sẵn trong bất kỳ tệp nguồn đã cho nào. Sử dụng -H để hiển thị liệu một tệp tiêu đề đã cho có sử dụng phiên bản được biên dịch trước hay không.

Hơn nữa, bạn phải biên dịch tệp tiêu đề có cùng cờ trình biên dịch giống như tệp nguồn sử dụng nó.

Cách điển hình để thiết lập một môi trường PCH là như thế này:

main.cpp:

#include "allheaders.hpp" 

int main() { /* ... */ } 

allheaders.hpp:

#include <algorithm> 
// ... everything you need 

Compilation:

g++ $CXXFLAGS allheaders.hpp     # 1 
g++ $CXXFLAGS -H -c -o main.o main.cpp  # 2 
g++ $LDFLAGS -o myprogram main.o    # 3 

Sau BướC# bạn nên kết thúc bằng một tệp allheaders.hpp.gch, điều này sẽ khá lớn. Trong BướC# 2, cờ -H sẽ tạo ra đầu ra bổ sung cho bạn biết rằng tệp tiêu đề biên dịch sẵn đang được sử dụng. BướC# 3 liên kết tệp thực thi.

Ý tưởng là BướC# 1 có thể mất nhiều thời gian, nhưng BướC# 2 sẽ nhanh hơn rất nhiều.

+1

Tôi đã phân tích lệnh GCC và nó đang tham chiếu một tệp văn bản giả 308 MB dường như là một tiêu đề được biên dịch trước đã xử lý. Phần đầu được biên dịch trước được tự động bao gồm cho mọi tệp nguồn, mà một số người dường như không nhận được và giới thiệu độ trễ khoảng 6 giây. Tôi không nhớ có vấn đề này với studio hình ảnh mặc dù với VS tôi luôn luôn chạy nó trên một máy trạm beefier.Thời gian trễ thứ hai là 6 giây khi tôi thay đổi một chữ cái trong một tệp là không thể chấp nhận được và cộng thêm tối đa phút/giờ/ngày lãng phí trong chu kỳ phát triển. – user805547

+0

Vâng, bạn nên loại thông minh về tiêu đề nào cần biên dịch trước. Tất nhiên bạn không nên có một PCH một kích thước phù hợp. Lý tưởng nhất là bạn nên tạo tiêu đề "tất cả tiêu đề" riêng biệt cho mỗi tệp * * nguồn riêng lẻ. Thực tế, tôi đã đặt trước điều trị đó cho những tệp thực sự triển khai tất cả nội dung Boost mạnh mẽ. –

+0

Tôi sử dụng tăng khá nhiều ở khắp mọi nơi để không đặt chúng trong PCH sẽ chỉ khiến các tệp riêng lẻ biên dịch chậm. Tôi bắt đầu nghĩ rằng máy tính xách tay và phần mềm này quá chậm để phát triển C++ nghiêm trọng. Nó là tốt cho Cocoa nhưng Boost và sử dụng nặng nề của các mẫu và lập trình meta là một kẻ giết người. – user805547

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