[Решено] Смешивание статической и динамической линковки

Модератор: Модераторы разделов

Ответить
IMB
Сообщения: 2561
ОС: Debian

[Решено] Смешивание статической и динамической линковки

Сообщение IMB »

Доброго дня!
Программу необходимо слинковать с двумя библиотеками, одна из библиотек используется во многих местах, поэтому её предпочтительно линковать динамически.
динамическая линковка

Код: Выделить всё

$(CROSS)gcc $(CCFLAGS) $(SRC)/fpga.c -o $(BIN)/fpga.cgi \
        -L$(LIBSPI_DIR)/lib -lspi \
        -L$(LIBGPIO_DIR)/lib -lgpio

$ arm_v5t_le-ldd bin/fpga.cgi
        libspi.so => not found
        libgpio.so => not found
        libc.so.6 => /home/kirill/MVK-IP/SDK/montavista/pro/devkit/arm/v5t_le/target/lib/libc.so.6 (0xdead1000)
        /lib/ld-linux.so.3 => /home/kirill/MVK-IP/SDK/montavista/pro/devkit/arm/v5t_le/target/lib/ld-linux.so.3 (0xdead2000)

$ ls -l bin/fpga.cgi
-rwxr-xr-x 1 kirill kirill 10056 Sep 16 14:25 bin/fpga.cgi

статическая линковка

Код: Выделить всё

$(CROSS)gcc $(CCFLAGS) $(SRC)/fpga.c -o $(BIN)/fpga.cgi \
        -L$(LIBSPI_DIR)/lib -lspi \
        -L$(LIBGPIO_DIR)/lib -static -lgpio

$ arm_v5t_le-ldd bin/fpga.cgi
        not a dynamic executable

$ ls -l bin/fpga.cgi
-rwxr-xr-x 1 kirill kirill 2426697 Sep 16 14:27 bin/fpga.cgi

смешанная линковка

Код: Выделить всё

$(CROSS)gcc $(CCFLAGS) $(SRC)/fpga.c -o $(BIN)/fpga.cgi \
        -L$(LIBSPI_DIR)/lib -lspi \
        -L$(LIBGPIO_DIR)/lib -Wl,-static -lgpio

/home/kirill/MVK-IP/SDK/montavista/pro/devkit/arm/v5t_le/bin/../lib/gcc/armv5tl-montavista-linux-gnueabi/4.2.0/../../../../armv5tl-montavista-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status
make: *** [all] Error 1

Вопрос - как правильно провести смешанную линковку?
Спасибо.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: [Решено] Смешивание статической и динамической линковки

Сообщение watashiwa_daredeska »

Файлы статических библиотек (bla-bla-bla.a) указывать в командной строке так же, как *.o, а не как библиотеки. При указании статических библиотек нужно соблюдать определенный порядок следования: сначала библиотека, которая требует определенный символ, потом библиотека, которая предоставляет этот символ. В принципе, библиотеки можно указывать два и более раз, но по-хорошему, это нужно только для удовлетворения циклических зависимостей.
Спасибо сказали:
IMB
Сообщения: 2561
ОС: Debian

Re: [Решено] Смешивание статической и динамической линковки

Сообщение IMB »

Привёл команду сборки к виду:

Код: Выделить всё

$(CROSS)gcc $(CCFLAGS) $(SRC)/fpga.c $(LIBGPIO_DIR)/lib/$(LIBGPIO).a \
        -o $(BIN)/fpga.cgi -L$(LIBSPI_DIR)/lib -lspi
Спасибо сказали:
Ответить