Weinlinkerfehler: versuchen LNK zu erstellen
Frage
Ich versuche, eine LNK-Datei programmatisch zu erstellen. Ich würde es vorziehen C zu verwenden, aber C ++ ist in Ordnung (und ist, was die alle MSDN-Zeug ist in).
Das entsprechende Codebeispiel ist:
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
HRESULT CreateLink(LPCSTR lpszPathObj, LPCSTR lpszPathLink, LPCSTR lpszDesc) {
HRESULT hres;
IShellLink* psl;
/* Get a pointer to the IShellLink interface. */
hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
IID_IShellLink, (LPVOID*)&psl);
return hres;
}
Ich versuche, mit WINEG comple ++ verwenden:
wineg++ -mno-cygwin -o t t2.cpp
Und ich bin immer die folgenden Fehler:
t2-Tw9YPp.o: In function `CreateLink(char const*, char const*, char const*)': t2.cpp:(.text+0x34): undefined reference to `IID_IShellLinkA' /usr/bin/ld: t2-Tw9YPp.o: relocation R_386_GOTOFF against undefined hidden symbol `IID_IShellLinkA' can not be used when making a shared object /usr/bin/ld: final link failed: Bad value collect2: ld returned 1 exit status winegcc: i486-linux-gnu-g++ failed
Irgendwelche Ideen?
Lösung
scheint die Lösung zu sein, den Abschnitt zu ändern, schließt an:
#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>
dh, fügen #define INITGUID
vor allem und umfassen #include <initguid.h>
Ich habe keine Ahnung, warum das funktioniert.
Ich musste auch -lole32 hinzuzufügen, einen Fehler zu beheben, kam nach dem zitierten eine gelöst wurde.
Der Code kompiliert ... jetzt zu sehen, ob ich es machen kann tun, was ich brauche.
Andere Tipps
Der Linker beschwert, dass sie nicht weiß, wo IID_IShellLinkA
definiert ist. Sie haben die Erklärung in einem Header, aber du bist wahrscheinlich eine Bibliothek fehlt. Ich denke, es definiert ist in libuuid , so enthalten, dass in Ihrer Verknüpfung Befehl mit -luuid
. Der Linker wird wahrscheinlich automatisch einen bestimmten Satz von Bibliotheken umfasst, die konfiguriert, einschließlich kernel32 und user32, aber Uuid vielleicht nur nicht auf dieser Liste sein.