2017-11-08 29 views
6

Buduję projekt C++ oparty na csake.Bardzo długi czas łączenia z opcjami -g i bez -DNDEBUG

Tworzenie projektu w trybie zwolnienia zajmuje tylko kilka sekund. Etap łączenia trwa mniej niż sekundę (gdy make drukuje Linking CXX executable myproject.exe).

Budowanie w trybie debugowania zajmuje więcej niż minutę. Większość tego czasu spędza łącząc plik wykonywalny. Dzieje się tak nawet podczas kolejnych kompilacji po minimalnych zmianach w kodzie.

Różnica w stosunku do trybu zwolnienia wydaje się być opcją -g w porównaniu z opcjami . Czy takie zachowanie jest oczekiwane? Pracowałem nad podobnymi projektami wcześniej (~ 18k LOC), ale nigdy nie doświadczyłem tak dużej różnicy czasu kompilacji między trybami debugowania i wydania.

ten trwa 50 sekund:

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

Informacje o debugowaniu mogą być dość duże. Ponadto, myślę, że opcja '-NDEBUG', o której wspomniałeś, jest w rzeczywistości' -DNDEBUG', która jest opcją preprocesora '-D' definiującą makro. –

+0

@Someprogrammerdude Masz rację, zaktualizowałem swój post. Nadal wydaje mi się dziwne, że kompilacja trwa ponad minutę, niezależnie od tego, czy jest to czysta kompilacja czy przebudowa. – Jawap

+3

@Jawap Czy to możliwe, że pominięcie 'NDEBUG' włącza _lots of code_ w jakimś ogólnym nagłówku? – yugr

Odpowiedz

3

Niestety czasy Link do dużych projektów może być dość powolny, zwłaszcza w trybie debugowania. Rzeczy, które zazwyczaj pomagają to projekt

  • łupania do bibliotek dzielonych (to zrobić na przykład przez programistów LLVM)
  • łączenie na SSD (lub tmpfs)
  • korzystających złoty łącznik zamiast domyślnej BFD łącznikiem
+1

Istnieje również 'LLD', łącznik LLVM, który jest prawdopodobnie najszybszym łącznikiem i powinien być całkiem dojrzały : https://lld.llvm.org – valiano

+0

@valiano Dzięki, nie wspomniałem o tym, ponieważ jest całkiem nowy (zajęło Gold kilka lat, aby móc połączyć świat). – yugr

Powiązane problemy