On 12/1/2016 12:09 PM, Greg Saunders wrote:
Thanks, Daniel- that got me going in the right direction and I was able to get it running. There were lots of little gotchas and false starts, so to help others here are the steps I used, along with errors I encountered along the way:


 1. download curl from https://github.com/curl/curl (note that this
    has to be set up as a git repository locally rather than just
    downloading the files, otherwise step #2 below will not work)
 2. run buildconf.bat
 3. run mingw32-make.exe mingw32
 4. create new C project in codeblocks (main.c)
 5. copy contents curl/docs/examples/url2file.c
    <https://github.com/curl/curl/blob/master/docs/examples/url2file.c>
    intro main.c for my test program
 6. run program- gives error: "curl/curl.h: No such file or directory"
 7. Under "Project/Build Options/Search directories/Compiler tab" add
    relative path to "myCurlGitDownload\curl\include\" (the .h files).
 8. run program - gives error: "undefined reference to `curl_global_init'"
 9. Under "Project/Build Options/Linker Settings", add "libcurldll.a"
    (from curl/lib/ folder)
10. run program - gives error: "The program can't start because
    libcurl.dll is missing... "
11. Under "Project/Build Options/Search directories/Linker", add
    relative path to "myCurlGitDownload\curl\lib\"
12. run program - it works!

There is only one minor problem left: when I compile the code and then try to run the standalone .exe, it complains that "The program can't start because libcurl.dll is missing from your computer."

If I copy libcurl.dll to the same directory as the .exe it works fine, but I would rather bundle the libcurl.dll into the .exe.

I did try adding the CURL_STATICLIB compiler flag as described on https://curl.haxx.se/docs/faq.html#Link_errors_when_building_libcur, but that did not make any difference.

From searching on other sites, sounds like I might need a .lib file rather than a .dll if I want to bundle it into the executable, but I did not see any .lib files in the distribution. Is there a way to Make those?


mingw32 users are also able to use the better maintained autotools style scripts ./buildconf && ./configure from MSYS (sometimes included with mingw) to build using the mingw gcc. The m32 makefiles you used are fine but they don't detect or enable anything extra by default, you are expected to specify it in a configuration using the CFG variable. You can open up the lib/Makefile.m32 or src/Makefile.m32 to see how it works and is documented. If I were you I'd use at least Windows SSL, SSPI and IDN options, like this

mingw32-make.exe mingw32-clean
mingw32-make.exe mingw32 CFG=sspi-winidn-winssl

If your mingw is too old the import for WinIDN may not be available:
ld.exe: cannot find -lnormaliz
so skip it:

mingw32-make.exe mingw32-clean
mingw32-make.exe mingw32 CFG=sspi-winssl

At this point you will end up with a libcurldll.a (import library for the dll) and a libcurl.a (static library). Your question about why staticlib doesn't do anything is because you explicitly specified the DLL library. Typically this is how you would build the example simple.c using the DLL:

gcc -Wall -Wextra -o simple simple.c -I ../../include -L ../../lib -lcurldll

static libraries it's complicated though because you have to know at link time all the dependencies. In the case of Windows SSL and SSPI and IDN it (usually) looks like this:

gcc -DCURL_STATICLIB -Wall -Wextra -o simple simple.c -I ../../include -L ../../lib -lcurl -lcrypt32 -lnormaliz -lwldap32 -lws2_32

*Please note the repo master branch is for development and should not be used for production.* What that means is if you are going to release your software you should instead build it with the latest curl release. On the download page [1] you can find the official release source and also some contributed builds. Sign up for release announcements [2]. It is also possible to build the latest release from the repo by checking out the latest release tag (git checkout). You can find the latest release tag by going to https://github.com/curl/curl/releases/latest or you can automate it in a script like

curl -fLsS --proto =https https://api.github.com/repos/curl/curl/releases/latest | jq --raw-output ".tag_name | select(type == \"string\")"


[1]: https://curl.haxx.se/download.html
[2]: https://cool.haxx.se/mailman/listinfo/curl-announce

-------------------------------------------------------------------
List admin: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:  https://curl.haxx.se/mail/etiquette.html

Reply via email to