2013-08-09 14 views
38

MinGW ile derlerken, exe çalışmadan önce belirli dll dosyalarını MinGW bin dizininden kopyalamam gerekir ("-static" ve/veya "-static-libstdC++" kullanırken bile.) Bunu nasıl değiştiririm? ? Kullanmam gereken özel bir MinGW yapısı var mı? Sonuçta ben dizinde exe ama hiçbir şey ile programı çalıştırmak mümkün istiyorum (ve penceresiz ortam değişkenleri ayarlayın.) Bu Dosya en şunlardır:MinGW .exe koddan bağımsız olarak birkaç gcc dll gerektirir?

  • libstdC++ - 6.dll
  • libgcc_s_seh-1.dll burada libwinpthread-1.dll

Ve

  • adım en tam listesi Ben nadas:

    1. Up Açık Code :: Blocks
    2. seçin "File-> New-> Proje-> Konsolu"
    3. "Merhaba Dünya" projesi için proje ayarlarını doldurun
    4. Sağ ...-> Merhaba Dünya (Kök hedef Projesi-> Seçenekler kurmak tıklayın) -> Diğer Seçenekler
    5. zaten ayarlanmış "-fexceptions"
    6. CTRL F9 altında "-static" (veya "-static-libstdC++") girin: yürütme olmadan Projesi (İnşa)
    7. gidin, içinde Windows Gezgini ve yerleşik "Hello World.exe" dosyasını çalıştırın.
    8. "Hata: libstdC++ - 6.dll bilgisayarınızda eksik" diyen bir mesaj açıldığında "OK" ye tıklayın.
    9. "Hello World.exe" dizinine "libstdC++ - 6.dll" dosyasını/MinGW/bin/dizininden kopyalayın.
    10. "Hello World.exe" dosyasını çalıştırın
    11. "Error: libgcc_s_seh-1.dll bilgisayarınızda eksik."
    12. "libgcc_s_seh-1.dll" dosyasını "Hello World.exe" dizinine kopyalayın.
    13. "libwinpthread-1.dll" yi kopyalayıp tekrar sona erdirin.
    14. mesaj

      Hello World! 
      

    Edit görüntüle: Benim komut satırı olan: Gerekli Yukarıda belirtilen tüm dll dosyaları ile

    g++.exe -Wall -fexceptions -static -static-libgcc -static-libstdc++ -g -static-libgcc -static-libstdc++ -L. -c "C:\Users\______\Desktop\Hello World\main.cpp" -o obj\Debug\main.o 
    g++.exe -o "bin\Debug\Hello World.exe" obj\Debug\main.o 
    

    . Ve, güvende olmak için, kod şudur:

    // main.cpp 
    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
        cout << "Hello world!" << endl; 
        return 0; 
    } 
    
  • +0

    Bunu yapmak istediğiniz şey, her şeyi tek bir yeniden yüklenebilir yürütülebilir dosyada paketlemek gibi görünüyor. – Jiminion

    +0

    Kod bloklarının dışında yapıyorum. Yapma komutunu görmelisin. – Jiminion

    cevap

    30

    Buyrukların yanlış!

    main.cpp dosyanızın bulunduğu dizine gidin ve aşağıdakileri deneyin.

    g++.exe -Wall -c -g main.cpp -o obj\Debug\main.o 
    g++.exe -static -static-libgcc -static-libstdc++ -o "bin\Debug\Hello World.exe" obj\Debug\main.o 
    

    sonra artık (Hello Dünya programı için) dll kopyalamak gerekecektir.

    Diğer notlar:

    MinGW kurulum talimatları PATH ortam değişkeni

    c:\minGW;c:\MinGW\bin; 
    

    ayarlanmasını önerir.

    Normalde

    -static -static-libgcc -static-libstdc++ 
    

    bağlayıcı seçenekleri (bir kerede hepsini 3 deneyin) çalışmalıdır. Ancak libwinpthread-1.dll için değil.

    Ayrıca, yeniden derlemeden önce clean'u kullanmayı deneyin.

    "-statik-bir şey" komutu yok.

    Yalnızca standart kütüphaneler libgcc ve libstdC++ statik bağlama ayarlanabilir.

    Diğer kütüphaneler için, önce "-static" ile statik bağlantıya geçip ardından, ayrı komutlara, yani "-lpthread" ile içerilecek kütüphaneleri listelersiniz. İstisnalar kullanıldığı takdirde, kötü bir fikir olabilir

    +1

    Muhtemelen uygulamayı dağıtmak istemiyor ve istemcilerin MinGW'yi yüklemesini veya ortam değişkenlerini değiştirmesini istemiyor. – Praetorian

    +0

    @Praetorian: Bu bir geliştirme ortamı. OP müşterisine vermek isterse, gerekli tüm dll'leri kurulum dosyasıyla birlikte toparlamak zorundadır. Ama sadece "Merhaba Dünya" testleri gibi görünüyor. Bu nedenle, gerekli dosyaları bulunabilecekleri bir klasörde bulundurmamak oldukça aptalca olur. Bir düşüş için oldukça belirsiz. –

    +2

    * Nihayetinde, programın dizindeki * exe'den başka bir şeyle çalışabilmeyi istiyorum… DLL'lerin paketlenmemesi tam olarak ne yapmak istediğidir. Tüm çalışma zamanı kitaplıklarının statik kitaplık sürümleri varsa, hangisinin mümkün olması gerekir. – Praetorian

    5

    -static-libgcc. link options documentation,

    There are several situations in which an application should use the shared libgcc instead of the static version. The most common of these is when the application wishes to throw and catch exceptions across different shared libraries. In that case, each of the libraries as well as the application itself should use the shared libgcc.