c++ - 构建内部依赖第三方库的c++静态库

标签 c++ makefile g++ gnu static-linking

我想让一个库在 /home/my/library/libmyfoo.a 的位置说 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)依赖于第三方框架/库,即 gstreamerprotobufgrpc

/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 时,它会抛出对很多东西的 undefined reference 。这意味着它没有正确链接。

现在 AAA.ccBBB.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.cppg++ -std=c++11 -I/path/to/AAA.h myProgram.c -o myProgram -L/home/my/library/-lmyfoo

问候,

最佳答案

当您使用的静态库依赖于共享库时,您需要将最终二进制文件显式链接到这些共享库。这样做的原因是静态库只是目标文件的集合,打包到“ar”存档中(这就是 .a 文件。)没有存储有关共享库依赖项的信息。

关于c++ - 构建内部依赖第三方库的c++静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54821289/

相关文章:

c++ - 如何检查文件是否存在并且在 C++ 中是否可读?

c++ - 检查类型是否被声明为元类型系统(对于 SFINAE)

linux - 求助,不知道如何制作这个Makefile

makefile - 如何执行所有匹配通配符的 makefile 目标

gcc - 在 g++ linux 中找不到 -lc 和 -lm

c++ - 将 GNU C++ 程序移植到 Visual C++

c++ - 使用 GCC 插件打印调用的函数名称

c++ - 将 Google perftools 指定为 g++ 以便在 R 中使用 C++

c++ - Microsoft header 对声明没有评论,那么文档在哪里?

c - 制作文件模式 %o :%. c