1

First I'll explain the big picture :

I am creating an application where I separated most of the features in different libraries. One of them contains some classes that use curl. I actually use Ubuntu 64 bit to develop and test it, but my production environment is a NAS with an ARM processor. I intend to, later, also make it for windows.

Where I am now :

My application is running on linux and the ARM-based NAS. However, I don't link with curl, I use curl from command-line internally to do what I need. This has some drawbacks :

  • As a programmer, I consider it an ugly practice. I should link to libcurl, this is the normal and clean way of using features from other software components.
  • This implies that curl executable is installed on the target. Not only I don't want to rely on this but also after a system upgrade on the NAS, I found out that I can't rely anymore on this.

What I want

As I intended anyway to use curl as a library, I first tried to do it the "soft way" : dynamic linking. Although it worked on my development environment, it didn't work on the production one because I found out that the curl library installed there doesn't work as expected.

So my next try was using libcurl as a static library. I also considered it to be the best future-proof option for me as it would make sure that, either on the NAS or on any other system, the library I will be using will always be the same.

The problems I've solved so far

  • Including a static library in another static library

This is already well documented in other answers here in StackOverflow : How to merge two "ar" static libraries into one

I did this to create a combined library of my own one and libcurl and as far as I've checked, it worked.

  • Building libcurl statically from source

There also are other answers that cover this topic, and I managed to create a libcurl.a that has libcurl features only.

The problems I am still trying to solve

  • Building libcurl statically with all its dependencies

There are some information regarding this, for example here. I did what was suggested, calling the configure script with --disable-shared and --enable-static. I also did the "rm src/curl" before make and called make with LDFLAGS=-all-static, but the resulting libcurl still missed its dependencies (openssl, pthreads, zlib...). If I could solve this problem, it would answer my question. But not having succesfully done that, I tried another approach :

  • Manually merging all libcurl dependencies in a final lib

As I did for merging my library with libcurl into a new library, I also tried do add to it curl dependencies : zlib and openssl. So I compiled both from source to create static libraries and included them in the merge. I was not able to fully check the result as it seems that another one is missing : pthread. And I was not able to find pthread for downloading - compiling - static linking.

Looking at the big picture, my main problem is : how to I include curl in my final application so that there is no external dependency to it?

I think that if either of my two remaining problems would be solved, I would be solving my main problem. But if it is not the case, I also would be glad to hear from someone who knows a better way of solving this, or ideally already solved a similar issue.

Mickaël C. Guimarães
  • 1,020
  • 2
  • 14
  • 32
  • 3
    FYI, your comment and post is [discussed on Meta](https://meta.stackoverflow.com/q/410880/11407695). Drop by there if you are still active - apparently there is a demand for the shell script you mentioned 4 years ago. – Oleg Valter is with Ukraine Aug 19 '21 at 11:20

0 Answers0