Создайте статическую библиотеку для c ++, которая внутренне зависит от сторонних библиотек - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу, чтобы библиотека говорила libmyfoo.a в месте /home/my/library/libmyfoo.a

И я хочу использовать эту статическую библиотеку в простейшей форме, как показано ниже:

Допустим, это myProgram.cpp

#include "AAA.h"

int main(void) {
    int x = 2;

    myFooFunction(x);

    return(0);
}

Я хочу запустить это как g++ -std=c++11 -I/path/to/AAA.h myProgram.c -o myProgram -L/home/my/library/ -lmyfoo

Сейчас: AAA.hAAA.cc) зависят от сторонних фреймворков / библиотек, а именно gstreamer , protobuf и grpc

Иерархия в /path/to/AAA.h равна

Makefile
AAA.h
AAA.cc
AAA.o
BBB(Folder)
    BBB.cc
    BBB.h
    BBB.o

Makefile имеет правило:

GOOGLEAPIS_GENS_PATH ?= $(HOME)/GOOGLE/googleapis/gens
GOOGLEAPIS_API_CCS = $(shell find $(GOOGLEAPIS_GENS_PATH)/google/api \
    -name '*.pb.cc')
GOOGLEAPIS_RPC_CCS = $(shell find $(GOOGLEAPIS_GENS_PATH)/google/rpc \
    -name '*.pb.cc')
GOOGLEAPIS_SPEECH_CCS = $(shell find \
    $(GOOGLEAPIS_GENS_PATH)/google/cloud/speech -name '*.pb.cc')
GOOGLEAPIS_LONGRUNNING_CCS = $(shell find \
    $(GOOGLEAPIS_GENS_PATH)/google/longrunning -name '*.pb.cc')
GOOGLEAPIS_CCS = $(GOOGLEAPIS_API_CCS) $(GOOGLEAPIS_RPC_CCS) \
    $(GOOGLEAPIS_LONGRUNNING_CCS) $(GOOGLEAPIS_SPEECH_CCS)


OBJS = ./BBB/BBB.o AAA.o

.PHONY: all
all: libmyfoo.a
libmyfoo.a: $(OBJS) $(GOOGLEAPIS_CCS:.cc=.o)
    ar rcs $@ $(OBJS) $(GOOGLEAPIS_CCS:.cc=.o)
    ranlib $@
    echo "build final executable......"

Это создает libmyfoo.a с большим количеством *.o файлов в нем.

Проблема: Когда я пытаюсь запустить myProgram.cpp, как показано выше, он бросает неопределенную ссылку на множество вещей.Это означает, что он не получает правильную связь.

Теперь AAA.cc и BBB.cc зависят от grpc, protobuf и gstreamer, как я сказал.Поэтому я связал их в myProgram.cpp как

g++ -std=c++11 -I/path/to/AAA.h myProgram.c -o myProgram -L/home/my/library/ -lmyfoo -L/usr/lib -L/usr/lib64 -L/usr/local/lib64 -L/usr/local/lib -lgrpc++ -lgrpc -lgrpc++_reflection -lprotobuf -lpthread -lglib-2.0 -lgobject-2.0 -lgstreamer-1.0 -ldl -lboost_system -lboost_thread

И это работает абсолютно нормально .

Может кто-нибудь объяснить это, почему?А также возможно ли запустить myProgram.cpp так, как это упоминалось ранее, то есть g++ -std=c++11 -I/path/to/AAA.h myProgram.c -o myProgram -L/home/my/library/ -lmyfoo

С уважением,

1 Ответ

0 голосов
/ 22 февраля 2019

Если используемая вами статическая библиотека зависит от разделяемых библиотек, вам необходимо явно связать окончательный двоичный файл с этими разделяемыми библиотеками.Причина этого в том, что статическая библиотека - это просто набор объектных файлов, упакованных в архив «ar» (вот что такое .a файлы.) Информация о зависимостях разделяемой библиотеки не сохраняется.

...