2011-03-23 23 views
7

C++ kullanarak nasıl bağımlılık ağacı oluştururum? Bağımlılık ağacına göre, örneğin, belirli bir programın çalışabilmesi için hangi dosyaların ihtiyaç duyduğunu kontrol ediyorum. Bunu kontrol ederek, eksik veya bozuk dosyalar olup olmadığını bulabilirim.Yapı bağımlılığı ağaçları

Böyle bir şeyi nasıl yaparım?

düzenleme:

benim için öyle bir program aramıyorum!

+0

Teşekkürler, bu aracı biliyorum, ama kendi başıma nasıl yapacağımı arıyorum. Tabii ki bu araç kadar karmaşık bir şeye ihtiyacım yok. Sadece çok temel bir bağımlılık listesi oluşturmak istiyorum. – Lockhead

+1

Kaynak kodu yerine yürütülebilir dosya için bunu yapmak istediğinizi varsayarsak, platformu belirtmeniz gerekir (derleme sonrasında kaynak kod dili değil, yürütülebilir biçimini önemsediğiniz derleme). –

+0

Çapraz platformlara ihtiyacım var – Lockhead

cevap

2

Bağımlılıkları hesaplamak için çapraz platform yöntemi yoktur, çünkü bu aslında bir C++ sorunu değildir. Derleyici tarafından çalıştırılabilir format çıktıları ile ilgilidir ve bu her platformda farklıdır.

Linux'ta (ve muhtemelen diğer Uniselerde), ldd komutu ne istediğinizi gösterir. Bu, yürütülebilir dosyanın gerektirdiği (özyinelemeli) modülleri yazdırır ve ayrıca sisteminizde nerede bulunabileceğini söyler.

Windows'ta, Dependency Walker, bir yürütülebilir (veya başka bir DLL'nin) bağımlı olduğu tüm DLL'leri keşfetmenizi sağlayan mükemmel bir grafik araçtır.

+0

Elbette, bu sadece diğer kütüphanelerdeki bağımlılıkları tespit eder. Eğer bir programın çalışması gerekiyorsa * tüm * dosyaları (örneğin, çalışma zamanında dinamik olarak yüklenmiş olan görüntü dosyaları, vb. Gibi) çalıştırmanız gerekiyorsa, dosyaları derlemede belirlenmediğinden, bunu yapmanın kolay bir yolu yoktur. zaman. Linux'ta, 'strace' (grep, 'open' için çıktı) size, işlemin çalışma zamanında açıldığı tüm dosyaları anlatır, fakat elbette, programın sadece bu belirli çalışmasını anlatır, tüm olası dosyaları açmaya çalışır. . – mgiuca

+0

Ama hala bana bir bağımlılık ağacının nasıl kurulacağını söyleyemiyorum, Windows (şimdi Linux'u şimdilik unutmayalım çünkü kullanıcılarımızın çoğunluğu Windows'dadır). Bunu bir araçla yapabilirim, ama muhtemelen bir kütüphane kullanarak bunu yapmak için bir C++ programı yazmayı düşünüyorum. – Lockhead

+0

Windows'da bunu nasıl yapacağınızı bilmiyorum. Linux'ta kolay olurdu çünkü ldd bir komut satırı aracıdır. Sadece ldd'ye bir soket açar ve çıkan metni okursunuz. Windows'ta, insanlar genellikle programlı olarak erişilemeyen GUI araçları oluştururlar. – mgiuca

0

Windows hakkında konuşurken bir öneri: uygulamanızdan bir dosya açmak, okumak, yazmak, ... tüm çağrıları yakalayan ve muhtemelen bu dosyaları standart olarak filtreleyerek istenen dosyaların listesini oluşturan bir modül yazabilirsiniz. giriş/çıkış, bağlantı noktaları, aygıtlar, vb.

Bunu Linux'ta da yapabilirsiniz (bu, Windows'dan bile daha kolaydır).

Her neyse, bir hiyerarşi (ağaç) nasıl oluşturabileceğinizi anlayamıyorum. Sadece durumda: bu çözümü çift olarak başka biriyle kullanabilirsiniz (örneğin, ldd, dep walker, vb.).

+0

Bu modülü nasıl yazarım? – Lockhead

+0

Bu soru hakkında genel bilgiye ihtiyacınız varsa google 'Windows API hook' ile arama yapın. MS-Rem tarafından [wasm.ru] 'da (http://wasm.ru/publist.php?list=21#series_8), maalesef rusçada exellent makaleler var. Ayrıca bu amaçla yazılmış özel kütüphane buldum [hook-api] (http://www.hook-api).com /) ama hiç kullanmadım. Eğer daha spesifik bir cevaba ihtiyacınız varsa (tam olarak nasıl yazabileceğinizi, hangi API işlevlerinin kullanılabileceğini vb.) Sadece yeni bir soru oluşturabilir veya bana mail atabilirsiniz :) – maverik

+0

Bir bağımlılık ağacı oluşturmak için bu modülü kullanabilirsiniz. nasıl yazılacağını biliyorum. Sanırım seni postalayacağım. E-postan nedir? Teşekkürler! – Lockhead