2017-11-08 62 views
6

Tôi đang xây dựng dự án C++ dựa trên CMake của bên thứ ba.Thời gian liên kết rất dài với -g và không có tùy chọn -DNDEBUG

Xây dựng dự án ở chế độ phát hành chỉ mất một vài giây. Giai đoạn liên kết mất ít hơn một giây (khi make in Linking CXX executable myproject.exe).

Việc xây dựng trong chế độ gỡ lỗi mất hơn một phút. Hầu hết thời gian này là dành liên kết thực thi. Điều này xảy ra ngay cả trong quá trình xây dựng tiếp theo sau khi thay đổi tối thiểu mã.

Sự khác biệt đối với chế độ phát hành có vẻ là tùy chọn -g so với tùy chọn -O3 -DNDEBUG. Hành vi này có được mong đợi không? Tôi đã làm việc trên các dự án có kích thước tương tự trước (~ 18k LOC), nhưng tôi chưa bao giờ trải qua sự khác biệt lớn như vậy trong thời gian biên dịch giữa các chế độ gỡ lỗi và phát hành.

này có 50 giây:

C:\msys64\mingw64\bin\g++.exe -std=c++0x -Wall -Wextra -Wpointer-arith \ 
-Wcast-align -fstrict-aliasing -Wno-unused-local-typedefs -fvisibility- \ 
inlines-hidden -march=native -g -Wl,--whole-archive \ 
CMakeFiles\myproject.dir/objects.a -Wl,--no-whole-archive \ 
-o myproject.exe -Wl,--major-image-version,0,--minor-image-version,0 \ 
@CMakeFiles\myproject.dir\linklibs.rsp 
+0

Thông tin gỡ lỗi có thể khá lớn. Ngoài ra, tôi nghĩ rằng tùy chọn '-NDEBUG' mà bạn đề cập thực sự là' -DNDEBUG' là tùy chọn tiền xử lý '-D' để xác định macro. –

+0

@Someprogrammerdude Bạn nói đúng, tôi đã cập nhật bài đăng của mình. Tôi vẫn thấy kỳ lạ là dự án mất hơn một phút để biên dịch cho dù đó là một công trình sạch hay xây dựng lại. – Jawap

+3

@Jawap Có thể bỏ qua 'NDEBUG' cho phép _lots của code_ trong một số tiêu đề chung? – yugr

Trả lời

3

Thật không may lần liên kết cho các dự án lớn có thể khá chậm, đặc biệt là trong chế độ gỡ lỗi. Điều mà thường giúp đỡ những dự án

  • chia nhỏ file thành thư viện chia sẻ (đã xong ví dụ như các nhà phát triển LLVM)
  • liên kết trên SSD (hoặc tmpfs)
  • sử dụng mối liên kết vàng thay vì mặc định BFD mối liên kết
+1

Ngoài ra còn có 'LLD', liên kết LLVM, có lẽ là mối liên kết nhanh nhất và nên khá trưởng thành : https://lld.llvm.org – valiano

+0

@valiano Cảm ơn, tôi đã không đề cập đến nó vì nó khá mới (mất nhiều năm để có thể liên kết thế giới). – yugr

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