Ошибка компоновщика Wine:пытаюсь создать .lnk
Вопрос
Я пытаюсь создать файл .lnk программно.Я бы предпочел использовать C, но C++ подойдет (и в нем есть все, что есть в MSDN).
Соответствующий пример кода:
#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;
}
Я пытаюсь выполнить Wineg++, используя:
wineg++ -mno-cygwin -o t t2.cpp
И я получаю следующие ошибки:
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
Есть идеи?
Решение
Решение, по-видимому, состоит в том, чтобы изменить раздел include на:
#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>
то есть добавить #define INITGUID
перед всем и включить #include <initguid.h>
Я понятия не имею, почему это работает.
Мне также пришлось добавить -lole32, чтобы исправить ошибку, возникшую после устранения указанной.
Код компилируется...теперь посмотрим, смогу ли я заставить его делать то, что мне нужно.
Другие советы
Компоновщик жалуется, что не знает, где IID_IShellLinkA
определено.У вас есть объявление в заголовке, но, вероятно, вам не хватает библиотеки.Я думаю, что это определено в либуидный, поэтому включите это в свою команду связывания с помощью -luuid
.Компоновщик, вероятно, настроен на автоматическое включение определенного набора библиотек, включая kernel32 и user32, но uuid может просто отсутствовать в этом списке.