Search code examples
gcccompilationstatic-librariesunix-ar

How to force static library to include it dependencies?


I build my own static library with gcc and ar like this.

g++ \
    ... list of library sources ... \
    ... a lot of -L -l -I -D options etc... \
    -c \
    && ar crf ./lib/libpackager.a *.o

Then I use this library in my app. Currently I built it like this.

g++ \
    myApp.cpp \
    ... same -L -l -I options as in library ... \
    -L. -lpackager \
    -o myApp

It works, but I am little odd for me that I need to duplicate all -l and -L during building the app. Is it possible include all this library dependencies inside the library. My goal to build app like this.

g++ myApp.cpp -L. -lpackager -o myApp

Solution

  • Transferring comments into an answer.

    Specifying the -l and -L operations when compiling to object files is irrelevant. Some versions of GCC warn about arguments that won't be used because they are link-time arguments, and linking won't be used when you include the -c flag.

    The ar command doesn't know what to do with the C compiler's -l and -L arguments (it might have its own uses for the flags; one version of ar accepts but ignores -l).

    So, you have to specify the dependencies when you link with the static library. That is the way life has been since the early 70s — that aspect hasn't changed yet. Shared libraries can be built with the dependency information, but not static libraries.

    As I understand it, I need to build a shared library and link it in a static way, right?

    No. You either need to build and link a shared library as a shared library, or you need to accept that using a static library means you will need to specify other libraries on the command line when you use this library. There are systems to help manage such information; pkg-config is one such. AFAIK, you cannot link a shared library in a 'static way'.