gpt4 book ai didi

linux - 如何在 C++ 中正确链接 .so 库?

转载 作者:太空宇宙 更新时间:2023-11-04 12:01:41 48 4
gpt4 key购买 nike

我有这样的项目结构,

a.pb.h          --- includes -->    protobuf.h
b.grpc.pb.h --- includes --> a.pb.h & grpcpp.h

还有a.pb.ccb.grpc.cc文件。

extern C 的 C++ 包装器是 wrapper.ccwrapper.h 其中包括 b.grpc.pb。 hgrpcpp.hextern C 里面的函数是 char* helloWorld(const char*, const char*, const char*);

创建 a.pb.hb.grpc.pb.h.o:

g++ -fpic -std=c++11 `pkg-config --cflags protobuf grpc`  -c -o a.pb.o a.pb.cc
g++ -fpic -std=c++11 `pkg-config --cflags protobuf grpc` -c -o b.grpc.pb.o b.grpc.pb.cc

创建 libcombined.so 的步骤:

grpcprotobuf so 已经在/usr/local/lib 下提供。首先创建a.pb.ob.grpc.pb.o.so来编译wrapper文件为:

g++ -shared -o libcombined.so *.o

编译包装器为:

g++ -fpic wrapper.cc -l:./libcombined.so -c -o wrapper.o -std=c++11
a.pb.ob.grpc.pb.owrapper.o

.so > 作为 libcombined.so:

g++ -shared -o libcombinedwrapper.so *.o

编译 main.c 为:

gcc main.c -l:./libcombinedwrapper.so -o main -ldl

我正在从我的 main.c 文件调用 helloWorld,它是:

#include <stdio.h>
#include <dlfcn.h>

int main(){
char* (*fn)(const char*,const char*,const char*);
void *handle = dlopen("path_to/libcombined.so",RTLD_NOW);
if(handle==NULL){
fprintf(stderr, "Error: %s\n", dlerror());
}
fn = (char* (*)(const char*,const char*,const char*))dlsym(handle, "helloWorld");
if (!fn) {
/* no such symbol */
fprintf(stderr, "Error: %s\n", dlerror());
dlclose(handle);
return 0;
}
char* msg = fn("asd","asdas","asdasd");
printf("%s",msg);
return 0;
}

执行后出错:./main

Error: path_to/libcombinedwrapper.so: undefined symbol: _ZN6google8protobuf2io20ZeroCopyOutputStream15WriteAliasedRawEPKvi
Error: ./main: undefined symbol: helloWorld
Segmentation fault (core dumped)

上面的第一个错误来自 protobuf.h 文件中的符号。

有人可以建议我在链接时做错了什么,或者我在 main.c 文件中做错了什么吗?

最佳答案

g++ -shared -o libcombined.so *.o

您还需要链接对象的所有 依赖项(此处为libgrpc)。

您可以添加 -Wl,--no-allow-shlib-undefined 来验证 libcombined.so 正在链接它需要的一切 .

附言为避免核心转储,一旦 dlopen 失败,您应该退出返回

附言链接 *.o 通常是一个非常糟糕的主意 (TM)。使用适当的 Makefile 避免不必要的编译并显式列出您打算放入 libcombined.so 的对象。

关于linux - 如何在 C++ 中正确链接 .so 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52164491/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com