为 c++ 构建一个静态库,该库在内部依赖于第三方库
Build a static library for c++ which is internally dependent on third-party libraries
我想让图书馆说libmyfoo.a
在一个位置/home/my/library/libmyfoo.a
我想以最简单的形式使用这个静态库,如下所示:
假设这是我的程序.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
生成文件具有以下规则:
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......"
这将构建包含大量*.o
文件的libmyfoo.a
。
问题:当我尝试运行如上所示的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
问候
当您使用的静态库依赖于共享库时,您需要将最终二进制文件显式链接到这些共享库。原因是静态库只是对象文件的集合,打包到"ar"存档中(这就是.a
文件)。不存储有关共享库依赖项的信息。
相关文章:
- 如何在公共头文件中向库的用户公开枚举,同时在内部使用它?
- std::strlen 在内部是如何工作的?
- STRCMP内部IF在内部不起作用
- "std::string"是否将其字符作为签名字符在内部存储?
- 虚拟基类在内部如何工作?编译器如何解析对基方法的调用?
- C++:在"try"外部创建的类型会导致错误,但在内部不会
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- 特征运算符如何在内部解释为 MKL 函数?
- 指向C++中成员的指针如何在内部工作?
- 删除和删除[]在内部如何工作?
- 如何在没有第三方库的C 程序上显示图形
- 自动参数如何在内部工作
- C++放置位置删除如何在内部(C++运行时)工作?如何克服其局限性?
- 在内部使用ComboBox拖动ListWidget项目
- 为什么实体可以在内部范围内重用?C++
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- 使用 java 类在 C++ 内部导入外部 jarfile
- 为 c++ 构建一个静态库,该库在内部依赖于第三方库
- 如何将负数转换为更广泛的类型在内部工作
- 在程序关闭后,是否可以在内部保存变量并读/写入