c++ - 为c++构建一个内部依赖第三方库的静态库
问题描述
我想让图书馆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
and 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
andBBB.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
问候,
解决方案
当您使用的静态库依赖于共享库时,您需要将最终二进制文件显式链接到这些共享库。原因是静态库只是目标文件的集合,打包到“ar”存档中(.a
文件就是这样)。没有存储有关共享库依赖关系的信息。
推荐阅读
- node.js - 如何在自适应卡中包含产品视频?- 机器人框架 V4,Node.js
- r - 如果行为“空”,则在具有单个默认值的矩阵中交换 NA
- vba - Word 检查使用 VBA 的全局模板加载项
- c# - 阅读棋盘后在 Unity 中创建 FEN 字符串
- ruby-on-rails - 自定义 form_for collection_check_boxes 查看结果
- javascript - 如何在javascript中为未知类型变量的值返回布尔真/假?
- reactjs - 使用 Jest/ 酶测试 this.setState 以进行反应 JS - VSC
- python - 检索分类层预测总是产生相同的结果
- python - 重新启动脚本或删除所有已知变量
- sql - SQL 将 (-) 符号放在我的输出前面