C++ 将dll库导入代码块链接器时出现问题
我正在尝试将libcurl用于一个使用代码块IDE的简单应用程序。在Codeblocks IDE中,单击构建选项==>链接器设置==>链接库==>“添加”后,文件浏览器仅允许我在*.a、*.so、*.lib和*.dyl文件之间进行选择。为什么它不允许我选择*.dll文件?我下载了用于Windows for libcurl的二进制软件包,它们都提供.dll文件。这就是它看起来的样子: ==更新====C++ 将dll库导入代码块链接器时出现问题,c++,dll,linker,codeblocks,C++,Dll,Linker,Codeblocks,我正在尝试将libcurl用于一个使用代码块IDE的简单应用程序。在Codeblocks IDE中,单击构建选项==>链接器设置==>链接库==>“添加”后,文件浏览器仅允许我在*.a、*.so、*.lib和*.dyl文件之间进行选择。为什么它不允许我选择*.dll文件?我下载了用于Windows for libcurl的二进制软件包,它们都提供.dll文件。这就是它看起来的样子: ==更新==== 嗨,我现在下载了lib curl的以下zip文件 其中包括CURL源代码、DLL文件和.lib
.dll
本身(不能)。使用扩展名.lib
链接匹配的导入库
libcurl.dll
的导入库是libcurl.lib
。如果您已经下载并提取了cURL
,例如,到C:\develope\cURL-7.34.0-win32
,那么您将在以下位置找到导入库:
C:\develope\curl-7.34.0-win32\lib\libcurl.lib
。您应该将此文件添加到库中
对于您的代码::Blocks项目
然后,项目将链接(除非有其他问题),但为了成功运行,它必须在运行时搜索dll的位置之一找到libcurl.dll
。确保这一点的最简单方法是将libcurl.dll
的副本放在程序运行的目录中。否则你可以通过研究来决定它的位置
您可能很难找到要从中下载的正确二进制软件包
有太多的可供选择。一些
其中包括cURL
commandline工具包(您不需要)
其中一些是开发二进制文件包(您确实需要)
适用于各种平台。浏览及下载
curl-7.34.0-win32.zip
或curl-7.34.0-win64.zip
,具体取决于
无论您的目标是win32
还是win64
。提取归档文件并
在子目录lib
和dlls
中查找导入库和DLL,
分别
OP后续问题更新
<>你的程序是提供的例子:代码>简单。C < /C> >加上C++头,<代码> < /代码> ./P>
- 删除您的
项目,然后重新开始一个干净的libcurl
项目(而不是C
)李>C++
- 只向C项目添加一个源文件,例如
或其副本。不要将其设置为simple.C
文件或以其他方式更改它。不要向项目中添加任何其他文件李>.cpp
- 在构建选项中->链接器设置->链接库添加到
的相对路径libcurl.lib
- 在构建选项->搜索目录->编译器(非链接器)中,将相对路径添加到cURL
目录,而不添加任何其他内容(非include
目录)include\cURL
- 不要将任何内容放入搜索目录->链接器
- 构建项目。它为我编译和链接
curl-7.34.0-win64\lib\libcurl.lib
与32位工具链生成的32位对象代码mingw32
相链接。你不能那样做
将您在同一站点上安装的curl-7.34.0-win64
替换为curl-7.34.0-win32
。在项目中,将your\path\to\curl-7.34.0-win64\lib\libcurl.lib
替换为your\path\to\curl-7.34.0-win32\libcurl.lib
,然后重试。该示例将编译并链接
如果它在运行时找到32位libcurl.dll
,同样地,它也会正确运行,并且依次找到由libcurl.dll
动态加载的32位dll。出于本示例的目的,只需将所有DLL从your\path\to\curl-7.34.0-win32\DLLs
复制到与.exe
相同的目录中即可。要定期开发cURL
应用程序,您需要在系统上安装cURL
库
由于您首先选择下载64位cURL
,因此您可能希望构建64位
可执行文件(尽管32位可执行文件将在64位主机上运行)。你不能那样做
使用32位工具链,mingw32
。您可以安装64位工具链,例如,
并将其配置为C::B中的附加工具链
使用C::B 13.12安装C::B 13.12,该C::B 13.12预先配置了TDM-GCC,来自Hi Mike。谢谢你的评论。我在C++中使用库是很新的。我遇到的问题是,我似乎找不到这些库文件中的任何一个。我在这里下载了几个“软件包”:。我下载了win32_cygwin、win32_generic、win64_cygwin、win64_generic、win64_mingw64并提取了所有这些文件,在每个文件中,我看到的都是.exe文件,除了win64_mingw64(它有libcurl.dll和libeay32.dll)。但是,在所有这些文件中,我都没有看到.lib文件。我应该从那个页面下载“源文件”吗?嗨,迈克。我已经更新了我的原始帖子,添加了我的源代码,显示了codeblocks目录结构和我的构建选项链接器/编译器设置。我在构建示例源代码时仍然遇到问题。你知道设置有什么问题吗?嗨,迈克。谢谢你的更新。我不知道发生了什么事。我一步一步地遵照你的指示。
#include <iostream>
#include <stdio.h>
#include "curl/curl.h"
using namespace std;
int main()
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}
-------------- Build: Debug in libcurl_c (compiler: GNU GCC Compiler)---------------
mingw32-gcc.exe -Wall -g -IC:\Users\bbb\Desktop\libcurl_packages\confused_by_code\curl-7.34.0-win64\curl-7.34.0-win64\include -c C:\Users\bbb\Desktop\workspace\libcurl_c\main.c -o obj\Debug\main.o
mingw32-g++.exe -o bin\Debug\libcurl_c.exe obj\Debug\main.o C:\Users\bbb\Desktop\libcurl_packages\confused_by_code\curl-7.34.0-win64\curl-7.34.0-win64\lib\libcurl.lib
obj\Debug\main.o: In function `main':
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:9: undefined reference to `_imp__curl_easy_init'
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:11: undefined reference to `_imp__curl_easy_setopt'
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:13: undefined reference to `_imp__curl_easy_setopt'
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:16: undefined reference to `_imp__curl_easy_perform'
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:19: undefined reference to `_imp__curl_easy_strerror'
C:/Users/bbb/Desktop/workspace/libcurl_c/main.c:23: undefined reference to `_imp__curl_easy_cleanup'
collect2.exe: error: ld returned 1 exit status
Process terminated with status 1 (0 minutes, 1 seconds)
6 errors, 0 warnings (0 minutes, 1 seconds)