static vs. dynamic
Troy A. Griffitts
junkmail at crosswire.org
Mon Sep 3 18:00:04 PDT 2007
I'm a little fuzzy on how to build a .pc file that works correctly for
both dynamic and static builds.
We have an engine that can be built to install either static or dynamic
or both libraries. Clients of our engine use pkg-config to get cflags
and ldflags information.
Everything seems to work great for any one of the scenarios, but I don't
understand how to build a .pc file to work correctly for clients
regardless of what is installed (static, dynamic, or both).
The dynamic library gets its dependency info from the .la file, so the
.pc file Libs entry is short. The static library needs all the
dependencies listed in the Libs.private, as I understand.
A typical client makefile contains something like this:
.cpp:
g++ -g `pkg-config --cflags sword` $< -o $@ `pkg-config --libs
sword`
If the shared sword libs are installed, great, no problems.
If the both are installed, the shared are used, no problems.
If only the static are installed, we get tons of link errors.
If I change the line to:
g++ -g `pkg-config --static --cflags sword` $< -o $@ `pkg-config
--static --libs sword`
things work, no problems.
It's this last scenario I'm concerned about. The user shouldn't have to
know that only the static libs for sword have been installed. They
aren't choosing static over dynamic; they just want to link to whatever
is required for linking against the sword libraries. Which is where
pkg-config come in and does a great job; I usually don't need to know
all my compile or link options. But in this case the user does need to
know about 1 particular link option, in a sense.
Maybe I've just missed something, but if only static libs are available,
shouldn't pkg-config use Libs.private?
Thanks for any insights,
-Troy A. Griffitts
Here are the specifics:
libsword.la:
...
dependency_libs=' -licui18n -licuuc -licudata -lpthread -licuio
-L/usr/kerberos/lib64 -lcurl -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err
-lresolv -ldl -lidn -lssl -lcrypto -L/usr/lib64 -lz -lclucene'
...
sword.pc:
__________
prefix=/usr
exec_prefix=${prefix}
libdir=/usr/lib64
includedir=${prefix}/include
Name: SWORD
Description: Biblical Text Engine
Version: 1.5.9
Libs: -L${libdir} -lsword
Libs.private: -L${libdir} -lsword -lz -L/usr/kerberos/lib64 -lcurl
-lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err -lresolv -ldl -lidn -lssl
-lcrypto -lz -L/usr/lib64 -lclucene -licui18n -licuuc -licudata
-lpthread -lm -licuio
Cflags: -I${includedir}/sword
More information about the pkg-config
mailing list