Связывание с библиотекой в ​​зависимости от сторонних библиотек

Я создаю библиотеку, которая зависит от других библиотек ( libpng , libX11 и т. Д.). Я хотел бы знать, возможно ли (например, с некоторыми флагами) для двоичного файла пользователя не напрямую ссылаться на сторонние библиотеки, а скорее через мою библиотеку.

Вот пример:

libb.c (как libb.c )

 int get21() { return 21; } 

liba.c (как мой lib)

 int get21(); int get42() { return get21() * 2; } 

main.c (как код пользователя)

 int get21(); int get42(); int main() { printf("42 = %d\n21 = %d\n", get42(), get21()); return 0; } 

компиляция

 $ gcc -fPIC -shared libb.c -o libb.so $ gcc -fPIC -shared liba.c -L. -lb -Wl,-rpath=. -o liba.so $ gcc main.c -L. -la -Wl,-rpath=. /usr/bin/ld: /tmp/ccVm8exQ.o: undefined reference to symbol 'get21' ./libb.so: error adding symbols: DSO missing from command line 

Обычно мне нужно связать main с -lb . Но я не хочу, чтобы конечный пользователь должен был ссылаться на все библиотеки, поскольку он громоздкий и может измениться в будущем. Есть ли возможность избежать этого?

Я думаю, вы спрашиваете о динамических библиотеках, а не о статических (в соответствии с большинством комментариев).

Если это так, да, это возможно.

Предположим, у вас есть динамическая библиотека ( .so ), называемая A, которая, в свою очередь, использует другие библиотеки динамических ссылок B и C. Бинарный X, который хочет использовать библиотеку A, должен только ссылаться на библиотеку A, а библиотеки B и C будут автоматически Заметим, что X нужно будет явно ссылаться на B или C (и включать их заголовочные файлы), чтобы X мог использовать что-либо в B или C напрямую (в отличие от A).

Вот живой пример. Как вы видите, xml2-config говорит, что правильный способ ссылки на libxml2 – это просто использовать -lxml2 . Однако ldd показывает, что он, в свою очередь, связан с различными другими библиотеками, включая liblzma (например). Программе, использующей libxml2 , не нужно указывать -llzma в линии ссылок, если она напрямую не использует liblzma .

 $ xml2-config --libs -lxml2 $ ldd /usr/lib/x86_64-linux-gnu/libxml2.so linux-vdso.so.1 => (0x00007fff157c9000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7c51805000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7c515ec000) liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f7c513c9000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7c510c3000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7c50cfd000) /lib64/ld-linux-x86-64.so.2 (0x00007f7c51d93000) 

Если вы спросите, как это сделать, ключевая вещь, которую я нашел, – это убедить ldd том, что библиотеки, которые он использует, правильно связаны. Я склонен к тому, чтобы использовать libtool .