2

我正在尝试在我的程序中使用 dll,即 libcurl,但是,它没有链接。Libcurl 带有我可以包含的 .h 文件(负责 dllimport),但是我想我必须指定在以某种方式链接时实际使用的 dll ......我该怎么做?我正在使用 Borland C++ builder 进行编译,但我真的很想知道这些东西一般是如何工作的......

编辑:这是代码(来自 curl 主页的直接 c/p)

bool FTPGetFile::ConnectToFTP(string ftpServer){
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "curl.haxx.se");
    res = curl_easy_perform(curl);
    return true;
}else{
    return false;
}
} 

以下是错误:

[链接器错误] 错误:从 C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 引用的无法解析的外部 '_curl_easy_init'
[链接器错误] 错误:从 C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 引用的无法解析的外部 '_curl_easy_setopt'
[链接器错误] 错误:从 C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ 引用的无法解析的外部“_curl_easy_perform”

编辑 2:根据 joe_muc 的建议,我使用 implib 工具制作了 lib 文件,并将它们包含在链接器路径中。我仍然得到同样的错误。

4

6 回答 6

2

在构建器的 bin 或 app 目录中应该有一个名为 IMPLIB.EXE 的程序。对 dll 运行它以创建一个 .lib 文件。

编辑:在线文档

于 2008-12-15T11:41:13.877 回答
2

如前所述,您将需要与通过 implib 运行的 .dll 一起使用的静态 .lib 文件,并将结果 lib 文件添加到您的项目中。

如果你这样做了,那么:

  • 您可能需要使用 stdcall 调用约定。您没有提及您使用的是哪个版本的 Builder,但它通常位于项目选项 - 高级编译器 - 调用约定下。
  • 您可能需要启用 MFC 兼容性选项。
  • 这可能是名称修改问题(项目选项 - C++ 兼容性选项)。
  • 或世代下划线
  • 或高级链接器选项“Case_insensitive-link”打开或关闭

libcurl 似乎是 C 代码;但如果是 C++,请注意 Microsoft 和 Borland 类一般不兼容。应该有一些技巧可以让它们发挥作用,但处理起来确实是一团糟,而且我从未成功过。C 编码的 DLL 应该可以工作。

于 2008-12-16T05:42:14.613 回答
2

使用 "Depends.Exe" 浏览 .DLL,找到您要使用的函数的确切名称,然后为 dll 添加 .lib 文件(或使用 borland 的 implib 创建它),并包含 .lib 文件在您的 bpr 项目文件中,通过右键单击并将其添加到项目中。然后在代码的顶部,使用 __declspec(dllimport) 来取悦链接器之神。

于 2009-12-26T13:01:29.277 回答
1

通常,如果您要链接 Windows DLL,则需要将 DLL 或导入库的名称传递给链接器,否则它将无法链接可执行文件。

您引用的错误消息表明您确实需要指定 DLL 或导入库。当您将 curl 构建为 DLL 时,它可能同时创建了一个 .lib 和一个 .dll 文件。将链接器指向 .lib 文件,并在启动应用程序时确保 .dll 文件位于路径中的目录中,以便加载程序可以找到它。

于 2008-12-15T10:21:00.357 回答
1

到目前为止,最常见的解决方案是使用作为构建 libcurl 的一部分的导入库 (.lib)。这告诉(静态)链接器如何为动态加载准备 EXE。

于 2008-12-15T10:34:30.453 回答
0

您是否尝试将 .h 文件添加到您的项目中?

于 2008-12-15T11:28:19.877 回答