2017-10-23 2 views
2

ich folgendes Programm haben, die ich bin mit MinGW kompilieren:Programm arbeitet in cmd, tritt sofort mit dem Status 127 in Cygwin, keine Ausgabe in Emacs Shell

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    cout << "aoeu" << endl; 
    string str; 
    return 0; 
} 

Als ich das kompilieren und ausführen Programm in der Windows-Eingabeaufforderung, ich die folgende Ausgabe wie erwartet:

C:\p\conscell>conscell.exe 
aoeu 

Allerdings, wenn ich es in Cygwin laufen, ich die folgende Ausgabe (oder deren Fehlen):

$ ./conscell.exe 
$ echo $? 
127 

Wie Sie sehen können, ist der Exit-Code 127, was anzeigt, dass die Datei oder eine Bibliotheksabhängigkeit nicht gefunden wurde. Wenn ich das Programm in M-x shell in Emacs (das C:/Program Files/Emacs/libexec/emacs/25.3/x86_64-w64-mingw32/cmdproxy.exe ausgeführt wird) ausführen, gibt es außerdem keine Ausgabe.

Wenn ich die string str; Linie löschen, um das Programm zu diesem Wechsel:

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    cout << "aoeu" << endl; 
    return 0; 
} 

Dann Cygwin und Emacs kann die Datei finden, wie durch den Ausgang Cygwin erlebt:

$ ./conscell.exe 
aoeu 

Dies erscheint um anzuzeigen, dass die Verwendung eines std::string im Programm bewirkt, dass es von einigen Dateien abhängt, die cmd finden kann, aber Cygwin und cmdproxy.exe nicht. Jede Hilfe, um herauszufinden, welche Dateien das sind, würde geschätzt werden.

Antwort

3

Sie sollten Ihre ausführbare Datei mit Abhängigkeit Walker oder ähnliche Dienstprogramme überprüfen, um herauszufinden, auf welchen Bibliotheken es abhängt. Und dann legen Sie sie in den gleichen Ordner als ausführbare Datei, so dass sie unabhängig von der aktuellen Umgebung gefunden werden können. Siehe Dynamic-Link Library Search Order. Alternativ können Sie sie statisch verknüpfen.

+0

Ziemlich sicher, das ist die Antwort (siehe Kommentare zu der anderen Antwort). Ich werde morgen alles testen. – jcarpenter2

+0

Ja, das war es. Um genau zu sein habe ich die Namen aller DLLs, die geladen wurden, indem ich [diesen Code] (http://forum.cheatengine.org/viewtopic.php?t=563414) geändert habe und die exe gestartet habe, indem ich [cheat engine] (http://www.cheatengine.org/) obwohl jeder Debugger funktionieren sollte. Dann habe ich für jede geladene DLL 'where [dll]' in einem Terminal ausgeführt, um herauszufinden, woher es kam. Sie stammten alle aus system32 mit Ausnahme von 'libstdC++ - 6.dll', das von mingw UND von gtksharp stammte, das vor dem mingw in PATH erschien. In meinem Fall brauchte ich gtksharp nicht, also habe ich es deinstalliert und jetzt funktioniert alles. – jcarpenter2

+0

Natürlich, wenn ich diese Programme Leuten geben werde, sollte ich entweder mit '-static-libC++' kompilieren oder die DLL trotzdem packen ... – jcarpenter2

1

MinGW Kompilieren mit GCC, aber für Windows-Umgebung, so dass es manchmal Windows-Bibliotheken und kompiliert für die Windows-Architektur verwendet. Cygwin ist eine leichte Unix-Umgebung.

Wenn ich mich nicht irre Cygwin enthält MinGW oder GCC. Wenn Sie Ihr Programm unter Windows kompilieren mit eigenständigen MinGW ausführen möchten, wenn es unter Unix-Arbeit unter Unix OS laufen soll. Wenn Sie für beide wollen, müssen Sie zweimal kompilieren, denke ich. Verwenden Sie ein Makefile, das mit beiden Compilern kompiliert.

+0

Ich kann viele andere EXEs mit Cygwin ausführen. Mein Workflow umfasst das Testen von Anwendungen in der Emacs-Shell. Daher möchte ich in der Lage sein, sie dort zu kompilieren und auszuführen. – jcarpenter2

+0

Also andere Programme, die Sie kompiliert hat, funktioniert auf CMD und Cygwin und Emacs, aber diese besonders nicht? – HangrY

+0

Ja, ziemlich viel. Ich weiß nicht, ob ich das sagen sollte, aber bevor ich Windows neu installierte, konnte ich Programme mit 'std :: string' kompilieren und ausführen, alles innerhalb von emacs shell, und jetzt kann ich nicht. Ich bin mir nicht sicher, was der Unterschied ist. – jcarpenter2

Verwandte Themen