在C++程序中使用一个DLL(包括Borland C++ Builder和其他一般情况)。

3

我正试图在我的程序中使用一个dll,即libcurl,但是它没有链接。Libcurl带有.h文件,我可以包含(处理dllimport),但是我想知道如何在链接时指定实际使用的dll。我正在使用Borland C++ Builder进行编译,但我真的想知道这些东西通常是如何工作的...

编辑: 这是代码(来自curl首页):

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;
}
} 

以下是翻译结果:

以下是错误信息:

[链接错误] 错误:未解析外部引用'_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',位于C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ

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


为什么你不直接使用你选择的编译器自己编译libcurl呢?这样就不会有链接问题了。 - Jesper Juhl
为什么你不直接用你喜欢的编译器自己编译libcurl呢?这样你就不会遇到链接问题了。 - undefined
6个回答

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

2
在构建器的bin或app目录中应该有一个名为IMPLIB.EXE的程序。运行该程序来对dll文件进行处理,以创建一个.lib文件。 IMPLIB.EXE,Win32的导入库工具

新的链接是IMPLIB.EXE,导入库工具 - yanjost

2
如上所述,您需要使用与运行implib的.dll文件相对应的静态.lib文件,并将结果lib文件添加到您的项目中。
如果您已经完成了这一步,则可能需要使用stdcall调用约定。您没有提到您正在使用哪个版本的Builder,但通常在项目选项 - 高级编译器 - 调用约定下。
您可能需要启用MFC兼容性选项。
这可能是一个名称混淆问题(项目选项 - C ++兼容性选项)。
或生成下划线
或高级链接器选项“Case_insensitive-link”开启或关闭 libcurl似乎是C代码;但如果它是C ++,请注意,Microsoft和Borland类通常不兼容。有一些技巧可以让它们工作,但处理起来非常麻烦,我从未成功过。C编码的DLL应该可以正常工作。

“代际下划线”这个东西似乎很有希望,因为我的原始错误消失了。然而,它产生了许多其他错误,而之前的代码是正常工作的。我猜它不适合我... 仍然将这个答案标记为正确,因为它非常有帮助。哦,顺便说一下:Borland太差了。 - c0m4
我很失望你不喜欢Borland编译器。我多年来一直在使用Borland C++,并且一直更喜欢Borland C++,而不是同一时期的任何微软C++(比如说Visual Studio 2002真是糟糕)。不过,我希望调用约定能够统一。 - Roger Nelson

1
通常情况下,如果您正在链接一个Windows DLL,您需要将DLL或导入库的名称传递给链接器,否则它将无法链接可执行文件。
您引用的错误消息表明,您确实需要指定DLL或导入库。当您将curl构建为DLL时,它可能创建了一个.lib和一个.dll文件。将链接器指向.lib文件,并在启动应用程序时确保.dll文件位于路径中的目录中,以便加载程序可以找到它。

我没有.lib文件,因为我下载了预编译的libcurl... 我已经将dll文件的路径添加到链接器中。但还是没有运气。 - c0m4
我会尝试自己构建该库。可能是你正在使用的库针对 Visual C++ 使用者,因为 Microsoft Linker 并不一定需要导入库。 - Timo Geusch

1
迄今为止最常见的解决方案是使用导入库(.lib),这是在构建libcurl时应该得到的。这会告诉(静态)链接器如何准备 EXE 以进行动态加载。

.lib和.a是一样的吗?我只有.a文件、.dll文件和.h文件。 - c0m4

0
你试过将.h文件添加到你的项目中吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接