Seite 1 von 1

fatal error LNK1181: Eingabedatei kann nicht geöffnet werden

Verfasst: 13. April 2012 19:31
von Torben
Hallo qtforum-Community!

Ich bin eigentlich Java-/C#-Programmierer und hatte bisher noch keinen Kontakt zu C++ und Qt. Ich wollte mir allerdings heute eine interessante Bibliothek und ein dazugehöriges Codebeispiel angucken, welche beide in C++ bzw. mit Qt sind. Dabei handelt es sich um folgendes (Opensource-)Projekt: http://pedsim.silmaril.org/download/

Die Library (libpedsim) kann ich problemlos in Visual Studio 2010 kompilieren. Allerdings habe ich Probleme mit dem Beispiel, das eine Qt-GUI benutzt. Ich habe das Qt-SDK und das Visual Studio Addin installiert. Jedoch kann ich wieder im Qt Creator noch in Visual Studio das Projekt bauen.

Im Qt Creator bekomme ich beim Bauen die Meldung:

Code: Alles auswählen

:-1: Fehler:LNK1181: Eingabedatei "pedsim.lib" kann nicht geöffnet werden.
In Visual Studio bekomme ich beim Bauen die Meldung:

Code: Alles auswählen

LNK1104: Datei "pedsim.lib" kann nicht geöffnet werden.	C:\Users\Torben\Downloads\pedsim_2.2\demoapp\src\LINK
"pedsim" ist der Name des Projektes selbst. Außer den Header-, Source-, Formular- und Ressourcendateien sehe ich da noch 2 .pro Dateien.

Code: Alles auswählen

#pedsim.pro
TEMPLATE = subdirs
SUBDIRS = src

#CONFIG += ordered

CONFIG += release

Code: Alles auswählen

#src.pro
TEMPLATE = app
TARGET = pedsim
DEPENDPATH += . release
INCLUDEPATH += . ../../libpedsim
DESTDIR = ../

QMAKE_LIBDIR += ../../libpedsim
QMAKE_LIBS += -lpedsim

QT += opengl

CONFIG += release
# CONFIG += console

FORMS = control.ui

# Input
HEADERS += agent.h mainwindow.h style.h obstacle.h control.h waypoint.h config.h scene.h tree.h loadscene.h
SOURCES += agent.cpp main.cpp mainwindow.cpp style.cpp obstacle.cpp control.cpp waypoint.cpp config.cpp scene.cpp tree.cpp loadscene.cpp

RESOURCES += application.qrc
Ich vermute, dass das Problem mit etwas mehr C++-Wissen leicht zu beheben wäre, nur leider fehlt mir da im Moment noch das Wissen. Weiß jemand wo das Problem liegt?

Gruß
Torben

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 13. April 2012 21:35
von Christian81
Und hast Du die pedsim.dll und pedsim.lib nun auch erstellt bzw. liegen sie vor?

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 14. April 2012 14:01
von Torben
Nein, eine pedsim.dll oder pedsim.lib habe ich nicht. Es gibt eine libpedsim.dll und libpedsim.lib. Die müssten aber ja wenn ich das richtig sehe gebaut werden: INCLUDEPATH += . ../../libpedsim.

pedsim ist ja der Name der Qt-Anwendung, deshalb verstehe ich gar nicht wieso er da irgendeine .lib haben will. Für mich sieht es so aus, als wollte er die Anwendung selbst als .lib verlinken oder so. :?

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 14. April 2012 17:20
von Christian81
Du baust also mit dem Visual Studio Compiler - demnach benötigst Du neben der pedsim.dll auch eine pedsim.lib (oder eben eine libpedsim.dll und libpedsim.dll). Wenn diese vorhanden sind und Du die Library benutzen willst dann musst Du sie per LIBS - Direktive in der pro-Datei angeben. Siehe qmake Doku

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 14. April 2012 18:47
von Torben
Eigentlich dachte ich, dass "libpedsim" auch gebaut wird beim Bauen des Qt-Projektes im Qt Creator. Ich bekomme auf jeden Fall die gleichen Warnings (die Header der libpedsim betreffend*) beim Bauen, d.h. ja, dass libpedsim wohl mitgebaut wird. Visual Studio war nur ein Versuch, eigentlich bin ich gerade im Qt Creator zugange.

Code: Alles auswählen

QMAKE_LIBDIR += ../../libpedsim
QMAKE_LIBS += -lpedsim
Wegen dieser Stelle sucht er die pedsim.lib, richtig? Also im Ordner "libpedsim"? Das macht für mich wenig Sinn, dann müsste es doch -llibpedsim sein? Ich hatte das mal probehalber geändert:

Code: Alles auswählen

QMAKE_LIBDIR += ../../libpedsim/Release
QMAKE_LIBS += -llibpedsim
Im Release-Ordner war eine lib und dll vom Bauen mit VS 2010. Dann ist die Meldung der nicht gefundenen lib weg, aber es kommt:

Code: Alles auswählen

Starte C:\Users\Torben\Downloads\pedsim_2.2\pedsim-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Release\pedsim.exe...Das Programm ist abgestürzt.
C:\Users\Torben\Downloads\pedsim_2.2\pedsim-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Release\pedsim.exe beendet, Rückgabewert -1073741515
Ich verstehe das ganze nicht. Ich kann mir eigentlich nicht vorstellen, dass der Quellcode fehlerhaft ist? Vielleicht könnte jemand anderes mal gucken, ob er es kompilieren kann? Der Download ist gerade mal 222kb: http://pedsim.silmaril.org/dist/libpeds ... -2-src.zip

*

Code: Alles auswählen

..\..\libpedsim\ped_agent.h:51: Warnung:C4251: 'Ped::Tagent::destinations': class 'std::queue<_Ty>' erfordert eine DLL-Schnittstelle, die von Clients von class 'Ped::Tagent' verwendet wird
with
[
    _Ty=Ped::Twaypoint *
]
u.a.

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 14. April 2012 19:05
von franzf
Christian schreibt "LIBS" und verlinkt dahin, und du nimmst QMAKE_LIBDIR/QMAKE_LIBS?

Re: fatal error LNK1181: Eingabedatei kann nicht geöffnet we

Verfasst: 14. April 2012 21:27
von Torben
Sorry, ich wollte nur nochmal klar machen, dass meiner Meinung nach die libpedsim ja schon eingebunden werden soll durch den Code.

Ich habe es jetzt also nochmal mit LIBS und der vorkompilierten libpedsim probiert.

Code: Alles auswählen

QMAKE_LIBDIR += ../../libpedsim
QMAKE_LIBS += -lpedsim
ersetzt durch

Code: Alles auswählen

win32:LIBS += C:\Users\Torben\Downloads\20120205-libpedsim-2-2-bin\libpedsim.lib
Das führt dazu, dass das Programm kompiliert, aber abstürzt.

Code: Alles auswählen

Starte C:\Users\Torben\Downloads\pedsim_2.2\pedsim-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug\pedsim.exe...Das Programm ist abgestürzt.
C:\Users\Torben\Downloads\pedsim_2.2\pedsim-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug\pedsim.exe beendet, Rückgabewert -1073741515
Ich habe testhalber auch einfach mal alle Klassen und Header der libpedsim in das Projekt kopiert und bei den SOURCES und HEADERS hinzugefügt und den INCLUDEPATH gelöscht. Danach ließ das Programm sich kompilieren und startete sogar. Allerdings bleibt das Simulationsfenster schwarz. Auf der Konsole wird ausgegeben:

Code: Alles auswählen

Starte C:\Users\Torben\Downloads\pedsim_2.2\pedsim-build-desktop-Qt_4_8_1_for_Desktop_-_MSVC2010__Qt_SDK__Debug\pedsim.exe...QGLShader::link: "Fragment shader(s) linked, vertex shader(s) linked. 
 " 
QGLShader::link: "Fragment shader(s) linked, vertex shader(s) linked. 
 " 
QGLShader::link: "Fragment shader(s) linked, vertex shader(s) linked. 
 " 
Komischerweise lässt sich das Programm auch nicht aus dem Windows Explorer starten. Mache ich dort einen Doppelklick auf die pedsim.exe passiert nichts.

EDIT: Oh, das schwarze Fenster war meine Schuld. Da fehlten einfach die Szenario-XMLs. Allerdings lässt sich die pedsim.exe trotzdem nicht außerhalb der IDE starten.
EDIT2: Der Grund dafür, dass die exe nicht aus dem Explorer startet sind die fehlende QtCore4.dll, QtGui4.dll und QtOpenGL4.dll. Ich hätte gedacht, dass die in den Ordner kopiert werden. Kann ich die automatisch in den Output-Ordner kopieren lassen? (Ich bin auch weiterhin noch an der Sachen mit der lib interessiert, alles zusammenzukopieren ist denke ich nur eine Notlösung.)
EDIT3: Für die DLLs habe ich mir jetzt ein PostBuildEvent gebaut: xcopy /y "$(ProjectDir)*.dll" "$(OutDir)"