【问题标题】:How can I link to DLLs from a C++ program built under Cygwin?如何从 Cygwin 下构建的 C++ 程序链接到 DLL?
【发布时间】:2020-03-03 23:17:13
【问题描述】:

给定以下文件

RsbbDec.exe

Run_RsbbDec.exe

TRSCompress.dll

TRSCompress.lib

以及以下示例代码:

#include <iostream>

#pragma   comment(lib,   "TRSCompress.lib.") 
extern "C" __declspec(dllexport) int    Run_RsbbDec(const char* Input_File, int vbr_en, int bitrate , char *ErrMsg);
#define TEXTLEN 1024


int main()
{
    char ErrMsg[TEXTLEN];

    if(Run_RsbbDec("audio.pcm", 1, 1, ErrMsg)) 
    {       
        std::cout <<"ok";
    }
    else
    {
        std::cout <<"error";
    }
}

如何使示例代码工作?我得到的唯一指示是确保 .dll 和 2 个 exe 在同一个目录中。

在我看来,演示代码的重点是运行我认为位于其中一个可执行文件中的 Run_RsbbDec 函数。

运行代码时出现链接器错误:

/tmp/ccuvBnWV.o:main.cpp:(.text+0x2b): undefined reference to `Run_RsbbDec'

我正在使用这个命令编译:

g++ main.c RsbbDec.exe Run_RsbbDec.exe

【问题讨论】:

  • 你用什么命令行编译?我认为您的(当前身份不明的)工具链需要被告知将您的 C++ 与其他二进制文件链接。
  • 在问题中添加了我用来编译的命令。我以前从未使用其他可执行文件进行编译。我一直只使用我自己的 .cpp 文件。所以我不太确定该怎么做
  • 我认为"TRSCompress.lib." 末尾的点不应该在那里。
  • 您的输出看起来像 Linux,但 DLL 和 EXE 用于 Windows。那里发生了什么事?你的环境是什么?你没有提供很多细节。
  • 我正在使用 Cygwin 在 Windows 上进行编译。如果需要,我可以使用 linux 编译

标签: c++


【解决方案1】:

很可能,第三方提供的 DLL 不是在 Cygwin 下构建的,而是使用 Visual Studio(或类似软件)原生构建的。

没关系,但是你必须做更多的工作才能在两个不同的环境之间形成兼容性。

您可以在 Cygwin 网站的页面 "Building and Using DLLs" 上阅读:

如果您已经有一个现有的 DLL,则需要构建一个与 Cygwin 兼容的导入库。如果您有编译 DLL 的源代码,请参阅名为“构建 DLL”的部分,了解有关让 gcc 为您构建一个的详细信息。如果您没有源或提供的工作导入库,则可以通过使用这些命令创建一个 .def 文件来获得大部分方法(您可能需要在 bash 中执行此操作才能使引用正常工作):

echo EXPORTS > foo.def
nm foo.dll | grep ' T _' | sed 's/.* T _//' >> foo.def

请注意,这仅在未剥离 DLL 时才有效。否则你会得到一个错误信息:“No symbols in foo.dll”。

一旦你有了.def 文件,你可以像这样从中创建一个导入库:

dlltool --def foo.def --dllname foo.dll --output-lib foo.a

或者,使用本地工具构建您自己的程序。

另外,pragma 是错误的;文件名末尾有一个错误句点。

【讨论】:

  • 我得到了 nm: TRSCompress.dll: 没有符号,所以看起来我有一个剥离的 DLL。如果我只是在 Visual Studio 中工作会更容易吗?
  • @user3702643 是的,它可能会。混合环境会带来复杂性。
猜你喜欢
  • 2022-11-13
  • 2023-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多