【问题标题】:Wine linker error: trying to create .lnkWine 链接器错误:尝试创建 .lnk
【发布时间】:2009-03-03 22:31:15
【问题描述】:

我正在尝试以编程方式创建一个 .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:在函数“CreateLink(char const*, char const*, char const*)”中: t2.cpp:(.text+0x34): 对‘IID_IShellLinkA’的未定义引用 /usr/bin/ld: t2-Tw9YPp.o: 重定位 R_386_GOTOFF 针对未定义的隐藏符号 `IID_IShellLinkA' 在制作共享对象时不能使用 /usr/bin/ld:最终链接失败:错误值 collect2: ld 返回 1 个退出状态 winegcc:i486-linux-gnu-g++ 失败

有什么想法吗?

【问题讨论】:

  • 您说您的问题是如何创建快捷方式文件,但您说明的问题是链接器错误。您是否知道如何创建快捷方式,只是在构建程序时遇到了麻烦,或者修复链接器问题仍然让您不知道下一步该做什么?
  • 认为 我有一些来自 MSDN 的示例代码,如果我可以将它链接起来,它们将构成我需要的基础。我可能应该更改问题标题,它 具有误导性
  • 如果你愿意放弃 C/C++,你可以在 Wine 中创建一个 .lnk 链接,使用一个简单的.bat dos shell 脚本in this answer——效果很好。

标签: c++ c windows wine lnk


【解决方案1】:

解决方案似乎是将包含部分更改为:

#define INITGUID
#include <windows.h>
#include <shobjidl.h>
#include <shlguid.h>
#include <initguid.h>

即,在所有内容之前添加#define INITGUID,并包括#include &lt;initguid.h&gt;

我不知道为什么会这样。

我还必须添加 -lole32 来修复引用的错误解决后出现的错误。

代码编译...现在看看我是否可以让它做我需要的。

【讨论】:

    【解决方案2】:

    链接器抱怨它不知道IID_IShellLinkA 的定义位置。您在标头中有声明,但您可能缺少一个库。我认为它是在 libuuid 中定义的,所以在你的链接命令中包含-luuid。链接器可能已配置为自动包含一组特定的库,包括 kernel32 和 user32,但 uuid 可能不在该列表中。

    【讨论】:

    • 添加 -luuid 不会更改错误消息。没有找到库并没有错误,只是错误没有改变。
    • 我没有 Wine,所以我不能确定它是在哪个库中定义的。您可以使用 elfdump 查看 Unix 库文件包含的内容。也许这也适用于 Wine 库,所以你可以在你的 lib 文件夹中搜索你需要的文件。
    • 我下载了 Wine。我在 shell32.dll.so 中找到字符串“IID_IShellLinkA”。
    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2014-10-28
    • 2019-11-07
    • 1970-01-01
    相关资源
    最近更新 更多