web-dev-qa-db-fra.com

MinGW .exe nécessite quelques dll gcc, quel que soit le code?

Lors de la compilation avec MinGW, je dois copier certains fichiers DLL du répertoire bin de MinGW avant que le fichier exe ne soit exécuté (même si vous utilisez "-static" et/ou "-static-libstdc ++".) Comment puis-je changer cela ? Existe-t-il une version spéciale de MinGW que je dois utiliser? En fin de compte, je veux pouvoir exécuter le programme avec rien d'autre que l'exécutable du répertoire (et aucune variable d'environnement Windows définie.) Ces fichiers sont les suivants:

  • libstdc ++ - 6.dll
  • libgcc_s_seh-1.dll
  • libwinpthread-1.dll

Et voici la liste complète des pas jachères:

  1. Ouvrez le code :: blocs
  2. Sélectionnez "Fichier-> Nouveau-> Projet-> Console"
  3. Remplissez les paramètres du projet "Hello World"
  4. Cliquez avec le bouton droit sur Projet-> Options de construction ...-> Hello World (cible racine) -> Autres options
  5. Entrez "-static" (ou "-static-libstdc ++") dans l'ensemble déjà défini "-fexceptions"
  6. CTRL-F9: Générer un projet (sans exécuter)
  7. Accédez à, dans l'Explorateur Windows, puis exécutez le fichier "Hello World.exe" intégré.
  8. Cliquez sur "OK" quand un message surgit disant "Erreur: libstdc ++ - 6.dll est absent de votre ordinateur."
  9. Copiez "libstdc ++ - 6.dll" du répertoire/MinGW/bin/dans le répertoire "Hello World.exe".
  10. Exécuter "Hello World.exe"
  11. Cliquez sur "OK" pour le message "Erreur: libgcc_s_seh-1.dll est absent de votre ordinateur."
  12. Copiez "libgcc_s_seh-1.dll" dans le répertoire "Hello World.exe".
  13. Répétez l'opération et finissez par copier "libwinpthread-1.dll" également.
  14. Voir le message

    Hello World!
    

Edit: Ma ligne de commande est la suivante:

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

Avec tous les fichiers DLL mentionnés ci-dessus requis. Et, juste pour être sûr, le code est:

// main.cpp
#include <iostream>

using namespace std;

int main()
{
    cout << "Hello world!" << endl;
    return 0;
}
46
Wolfgang Skyler

Vos commandes sont fausses!

Accédez au répertoire dans lequel se trouve votre fichier main.cpp et procédez comme suit.

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

vous n'aurez alors plus besoin de copier les DLL (pour votre programme Hello World).

Autres notes:

Les instructions d’installation de MinGW recommandent le réglage

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

à la variable d'environnement PATH.

Normalement le

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

les options de l'éditeur de liens devraient fonctionner (essayez les 3 en même temps). Mais pas pour libwinpthread-1.dll.

Essayez également de clean avant de recompiler.

Il n'y a pas de commande "-static-quelque chose".

Seules les bibliothèques standard libgcc et libstdc ++ peuvent être définies sur la liaison statique.

Pour les autres bibliothèques, vous devez tout d'abord passer à la liaison statique avec "-static", puis répertorier les bibliothèques à inclure avec des commandes distinctes, c'est-à-dire "-lpthread".

Les utilisateurs de Cmake devraient essayer d’ajouter:

set(CMAKE_CXX_STANDARD_LIBRARIES "-static-libgcc -static-libstdc++ -lwsock32 -lws2_32 ${CMAKE_CSS_STANDARD_LIBRARIES}")

set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Bstatic,--whole-archive -lwinpthread -Wl,--no-whole-archive")
39
moskito-x

-static-libgcc peut être une mauvaise idée si des exceptions sont utilisées. la documentation sur les options de lien indique que

Il existe plusieurs situations dans lesquelles une application doit utiliser le fichier libgcc partagé au lieu de la version statique. Le plus commun d'entre eux C'est quand l'application souhaite lancer et attraper des exceptions sur différentes bibliothèques partagées. Dans ce cas, chacune des bibliothèques en tant que ainsi que l’application elle-même doit utiliser la libgcc partagée.

7
J.J. Hakala

Les gens sont toujours confrontés à ce problème, dans Code :: Blocks essaie de reconstruire le projet. J'ai eu le même problème, mais la reconstruction de mon projet a aidé à résoudre le problème.

0
Uwohm9