使用c ++程序中的dll。 (borland c ++ builder和一般情况下)

时间:2008-12-15 10:09:01

标签: c++ dll c++builder dllimport

我正在尝试将dll(即libcurl)与我的程序一起使用,但是,它不是链接。 Libcurl带有我可以包含的.h文件(照顾dllimport),但是我想我必须指定在链接时实际使用哪个dll ...我该怎么做?我正在使用Borland C ++构建器进行编译,但我真的想知道这些东西是如何工作的......

编辑: 这是代码(来自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;
}
} 

以下是错误:

[Linker Error] Error: Unresolved external '_curl_easy_init' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ
[Linker Error] Error: Unresolved external '_curl_easy_setopt' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ
[Linker Error] Error: Unresolved external '_curl_easy_perform' referenced from C:\PROJECTS\PC\TOOLBOX\DEBUG_BUILD\FTPGETFILE.OBJ

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

6 个答案:

答案 0 :(得分:2)

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

编辑:Online Docs

答案 1 :(得分:2)

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

如果您已经这样做了:

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

libcurl似乎是C代码;但如果它是C ++,请注意Microsoft和Borland类通常不兼容。应该有一些技巧让他们工作,但这是一个真正的混乱处理,我从来没有成功。 C编码的DLL应该可以工作。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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