I (Kripto ++) toplam onun neredeyse 50MB kütüphane derlenmiş ....
Evet, statik kütüphane etrafında bütün sembolleri taşıyan bir kütüphane var. Gerekli olmadığı için hiçbir şey atılamaz.
-g
kullandıysanız, hata ayıklama bilgilerini de taşır. Bazı optimizasyon bayrakları da bunu etkileyecektir. Örneğin -Os
kod boyutunu en aza indirir.
statik kitaplığını kullanır proje
kaynak kodu ile derlendi proje daha 6,2 kat daha büyüktür. Bu neden?
Neler olup bittiğini daha iyi açıklamak için programınızı ve derleyicinizle linker anahtarlarınızı görmemiz gerekiyor.
Projesi 1 (kaynak) boyutu: 210KB Projesi 2 (statik lib) boyutu: 1,303kb
bu rakamlar dayanarak, beklediğiniz kadar bazı ölü kod sıyırma gerçekleşiyor tahmin söylemiyorum ama bağlayıcı gerekiyordu olsa
hep sadece benim kod üzerinde referans ettiğimi kullanın. Bu sadece bir linker verimsizlik mi?
Crypto ++ kütüphanesini oluştururken, make lean
tarifini kullanın. İşlev bölümleri (-ffunction-sections
) ve veri bölümleri (-fdata-sections
) ekler, böylece linker kullanılmayan kod ve verileri atmada daha iyi bir iş çıkarır. Ayrıca Crypto ++ wiki'de GNUmakefile | Makefile Targets'a bakın.
Uygulamanızı bağladığınızda uygun linker anahtarını kullanın. GCC/LD ile, bu -Wl,--gc-sections
olacaktır. Apple/DYLD altında, bu -Wl,-dead_strip
olurdu. Ayrıca, ikili boyutu daha da azaltacak olan hata ayıklama simgelerini de şeritleyebilirsiniz. Eğer sembollerle inşa edilmiş ya da sonradan soyulmuşsa, bana açık değil.
Sembolleri tamamen kaldırır ve atarsanız, yığın izleri çoğunlukla işe yaramaz olacaktır. Sembolleri çevrimdışı bir dosyada saklarsanız, yığın izlemeyi anlamış olabilirsiniz. Ayrıca, Crypto ++ wiki'de Debug Symbols'a bakın. İşte
kullanıcıları için
lean
hedef araştıran elde edilen sonuçlardır. Ayrıca Crypto ++ kullanıcı grubunda
'make lean' target?'a bakın.
Testi programı:
int main(int, char**) {
Integer j("100000000000000000000000000000000");
j %= 1999;
cout << "j: " << j << endl;
return 0;
}
Yalın (make lean
ile inşa kütüphane, program -Wl,--gc-sections
ile bağlantılı):
$ ls -l integer.exe
-rwx------ 1 jwalton staff 162012 Jan 4 13:00 integer.exe
Normal (make
, herhangi bir özel bağlayıcı anahtarları ile inşa kütüphanesi):
$ ls -l integer.exe
-rwx------ 1 jwalton staff 2636952 Jan 4 13:02 integer.exe
lean
hedef Kripto ++ 5.6.3 sonra ilave edildi
yayımlanmıştır. Eğer Commit 9696b9e5e79ff18a dan elle GNUmakefile için aşağıdaki yamayı uygulayabilirsiniz,
git clone https://github.com/weidai11/cryptopp.git cryptopp
Veya: Sen eğer istersen Master kod getirmesi gerekir.tarifler nerede aşağıdaki
+# Dead code stripping. Issue 'make lean'.
+ifeq ($(findstring lean,$(MAKECMDGOALS)),lean)
+ifeq ($(findstring -ffunction-sections,$(CXXFLAGS)),)
+CXXFLAGS += -ffunction-sections
+endif # CXXFLAGS
+ifeq ($(findstring -fdata-sections,$(CXXFLAGS)),)
+CXXFLAGS += -fdata-sections
+endif # CXXFLAGS
+ifneq ($(IS_DARWIN),0)
+ifeq ($(findstring -Wl,-dead_strip,$(LDFLAGS)),)
+LDFLAGS += -Wl,-dead_strip
+endif # CXXFLAGS
+else # BSD, Linux and Unix
+ifeq ($(findstring -Wl,--gc-sections,$(LDFLAGS)),)
+LDFLAGS += -Wl,--gc-sections
+endif # LDFLAGS
+endif # MAKECMDGOALS
+endif # Dead code stripping
Ve: böylece hat 270 veya etrafında ekle
+.PHONY: lean
+lean: libcryptopp.a cryptest.exe
+