Trouble importing dll library into CodeBlocks Linker
c++, codeblocks, dll, linker
Solution
A DLL (dynamic link library) is searched for and loaded by your program at runtime. To make this happen automatically, you do not link the `.dll` itself (you can't). You link the matching import library, with extension `.lib`.
The import library for `libcurl.dll` is `libcurl.lib`. If you have downloaded and extracted `cURL`, say, into `C:\develop\curl-7.34.0-win32`, then you will find the import library at `C:\develop\curl-7.34.0-win32\lib\libcurl.lib`. You should add this file to the libraries for your Code::Blocks project.
The project will then link (unless it has other problems), but in order for it to run successfully it will have to find `libcurl.dll` in one of the locations that are searched for DLLs at runtime. The simplest way to ensure this is to place a copy of `libcurl.dll` in the directory from which your program runs. Otherwise you can decide on a location for it by studying Dynamic-Link Library Search Order
You may have difficulty in finding the right binary package to download from the plethora available here. Some of them are packages of the `cURL` commandline tools (which you don't want) and some of them are packages of the development binaries (which you do want) for various platforms. Visit http://www.confusedbycode.com/curl/ and download either `curl-7.34.0-win32.zip` or `curl-7.34.0-win64.zip`, depending on whether you are targetting `win32` or `win64`. Extract the archive and find the import library and DLL in the subdirectories `lib` and `dlls`, respectively.
Update for OP's further issues
Your program is the supplied example `simple.c` with the addition of a C++ header, `<iostream>`.
- Delete your `libcurl` project and start again with a clean `C` project (not `C++`).
- Add only 1 source file to the C project, the example `simple.c` or a copy of it. Don't make it a `.cpp` file or otherwise change it. Don't add any other files to the project.
- In Build options -> Linker settings -> Link libraries add the relative path to `libcurl.lib` as you did before.
- In Build options -> Search Directories -> Compiler (not Linker) add the relative path to the cURL `include` directory and nothing else (not the `include\curl` directory).
- Do not put anything in Search directories -> Linker.
- Build the project. It compiles and links for me.
Update #2
The problem now is that you are attempting to link the 64-bit `curl-7.34.0-win64\lib\libcurl.lib` with the 32-bit object code generated by your 32-bit toolchain, `mingw32`. You can't do that.
Replace your install of `curl-7.34.0-win64` with `curl-7.34.0-win32` from the same site. In your project, replace `your\path\to\curl-7.34.0-win64\lib\libcurl.lib` with `your\path\to\curl-7.34.0-win32\lib\libcurl.lib` and try again. The example will compile and link.
It will also run correctly, provided that it finds 32-bit `libcurl.dll` at runtime, and likewise the 32-bit DLLs that are dynamically loaded by `libcurl.dll` in turn. For the purpose of the example just copy all the DLLs from `your\path\to\curl-7.34.0-win32\dlls` into the same directory as the `.exe`. For regular development of `cURL` apps you would want the `cURL` libraries installed on the the system.
Since you chose to download 64-bit `cURL` in the first place, you may wish to build 64-bit executables (although 32-bit executables will run on 64-bit hosts). You can't do that that with your 32-bit toolchain, `mingw32`. You can install a 64-bit toolchain, e.g. TDM-GCC MinGW Compiler, and configure it as an additional toolchain in C::B. Alternatively you could replace your C::B installation with a C::B 13.12 one that has TDM-GCC pre-configured, from Sourceforge
Problem
I am trying to use libcurl for a simple application using CodeBlocks IDE. In Codeblocks IDE, after clicking on Build Options ==> Linker Settings ==> Link Libraries ==> "Add" , the file browser only allows me to choose between *.a, *.so, *.lib, and *.dyl files. Why is it not allowing me to choose *.dll files? I downloaded the binary packages for Windows for libcurl and they all provide .dll files. This is what it looks like: ====UPDATE==== Hi I have now downloaded the following zip file for lib curl which includes CURL Source, DLL Files, and a .lib file. It can be found here: http://www.confusedbycode.com/curl/curl-7.34.0-win64.zip However, I am still having issues being able to compile my source code. Below is my source code: include ``` #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; } ``` - Below is a screen shot of my CodeBlocks IDE working directory: - Below are screen shots of my build options for Linker/Compiler, and Linker Libraries: I am not sure what is wrong with the setup. It is having trouble building. It is returning the following error messages: Below is the latest Build Log: ``` -------------- 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) ```