Я хочу, чтобы библиотека говорила 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.h
(и AAA.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
С уважением,