Soru CMake: bir lib için başka bir lib hedefine yerleştirilmiş nesne dosyalarını yeniden kullan


Projemi CMake'e taşımaya çalışıyorum ve aynı zamanda derleme sürecinde bazı optimizasyonlar yapıyorum.

İşte anlaşma:

  • Her biri statik bir kütüphanede derlenen (olması gereken) birkaç alt dizim var (bu çalışma).
  • Her alt dosyadaki tüm nesne dosyalarını daha büyük, eksiksiz, statik bir kütüphaneye toplamak istiyorum.

Şuna benziyor:

.
libBig.a  # made from object from subdir1 and subdir2
subdir1/
   src/
   libSubdir1.a
subdir2/
   src/
   libSubdir2.a

Bugün, CMakeLists.txt dosyasının her alt anahtarının kendi kaynak dosyalarını ekleyeceği bir global değişken kullanmayı başardım. Bu değişkeni büyük kütüphanemde "kaynak" girdisi olarak kullanıyorum:

# the big library depends on all the source files
# ${all_src} is automatically filled with each subdir's cpp file
get_property( BigLib_src GLOBAL PROPERTY all_src)
add_library( Big STATIC ${BigLib_src}) # recompiles all the sources

Şimdi, bu iş, çok kötü değil, ama şey şu ki, tüm kaynak dosyalarım iki kere derlendi: bir kez alt kütüphane için ve büyük kütüphane için bir kez.

CMake zaten onları inşa ettiğini unutuyor gibi görünüyor.

ben var alt dizin kütüphanelerini ve ar iki statik kütüphaneyi birleştiremez.

Bunu nasıl yapacağını biliyor musun?


21
2018-02-23 13:32


Menşei


Zaten CMake'e ne yapıyorsunuz? Niye ya? - Jack Kelly
El yapımı Makefiles'den! Çapraz platformun derlenmesi kolay, IDE'lerle entegrasyonun kolay olmasını istiyorum ve düşündüm: neden olmasın? - Gui13


Cevaplar:


Tanıtılan yeni OBJECT kütüphanesi özelliğini kullanabilirsiniz CMake 2.8.8. Fikir açıklandı İşte. Temel olarak, OBJECT kütüphanesi benzer bir kavramdır. kullanışlılık kütüphanesi Autotools'tan nesne dosyalarını gruplamak için bilinir.

Tamamen CMake'i kontrol edin OBJECT kütüphanesi öğreticisi.


26
2018-05-17 12:00



Aynı sorunu yaşadım ve OBJECT Kütüphanesini denedim, bir çekicilik olarak çalışıyor. teşekkür ederim - Baptiste Wicht


CMake 2.8.8'den itibaren bunu kullanarak yapabilirsiniz. OBJECT kütüphane türü. Görmek mloksot en Cevap. Eski durum, her bir hedefin kendi dizininin olmasıydı ve CMake her hedef için her bir bağımlı nesneyi inşa edecekti. Bu korumalar, tek bir kaynak dosyanın farklı birden çok kez kullanılabileceği bir duruma karşı CFLAGS. (Varsayılan olarak CMake'in automake'den daha muhafazakâr olduğunu unutmayın: automake, hedefler farklı hedefler için yeniden hedeflenmeyecek, ancak hedefler farklıysa CFLAGS (ve muhtemelen CPPFLAGSda).


3
2018-02-24 01:52



Sonunda yaptığım bu, ama sonuçtan hala memnun değilim, çünkü şimdi CMakeLists'im şişmiş görünüyor ve orijinal Makefile'mden daha fazla çizgiye ulaşıyor ... belki de CMake'in gelecekteki bir sürümü için. - Gui13
Denedin mi automakelibtool kolaylık kütüphaneleri ile? Yoksa bu noktada derleme sistemleriyle uğraşmaktan bıktınız ;-)? Her şeyi bir üst düzeyden olmayan bir yöntemle sürdürebilirseniz, kolaylık kütüphanelerine bile ihtiyacınız olmayabilir. Makefile.am. - Jack Kelly