Errore linker vino: tentativo di creare .lnk
Domanda
Sto cercando di creare un file .lnk a livello di codice. Preferirei usare C, ma C ++ va bene (ed è ciò che contiene tutto il materiale MSDN).
L'esempio di codice rilevante è:
#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;
}
Sto provando a compilare con wineg ++ usando:
wineg++ -mno-cygwin -o t t2.cpp
E sto riscontrando i seguenti errori:
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
Qualche idea?
Soluzione
La soluzione sembra essere quella di cambiare la sezione include in:
#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>
ovvero, aggiungi #define INITGUID
prima di tutto e includi #include <initguid.h>
Non ho idea del perché funzioni.
Ho anche dovuto aggiungere -lole32 per correggere un errore emerso dopo la risoluzione di quello citato.
Il codice viene compilato ... ora per vedere se riesco a farlo fare ciò di cui ho bisogno.
Altri suggerimenti
Il linker si lamenta di non sapere dove IID_IShellLinkA
è definito. Hai la dichiarazione in un'intestazione, ma probabilmente ti manca una libreria. Penso che sia definito in libuuid , quindi includilo nel tuo comando di collegamento con -luuid
. Il linker è probabilmente configurato per includere automaticamente un determinato set di librerie, inclusi kernel32 e user32, ma potresti non essere in quella lista.