Linux C 程序使用用 C/C++ 编写的共享库
Linux C program using shared libs written in c/c++
我正在做一个项目,主程序用C编写,它在嵌入式Linux系统上。 另一家公司提供的硬件,在那里我得到了他们的库(C 和 C++ 语言的静态库(.为了以后移植到其他设备,我制作了新的库(共享库(以链接到 C 语言的应用程序,那是:
their libs(static libs,c/c++) --> my libs(shared libs,c) --> my applications(c).
所有的 c 静态库都对我有用,在使用 c++ 库时,我的库编译得很好,但是链接到我的应用程序时会出现 2 个错误:
libplate.so:未定义对
operator delete(void*)
的引用 libplate.so:未定义对vtable for __cxxabiv1::__class_type_info
的引用
以下是编译此共享库的 makefile 部分。
CFLAGS = -Wall -mlittle-endian -I$(INC_PATH)/plate
CPPFLAGS = -Wall -mlittle-endian -I$(PLAT_PATH)/include/sfc -I$(INC_PATH)/plate
OBJ = $(patsubst %.c, %.o, $(SRC))
OBJ += $(patsubst %.cpp,%.o,$(SOURCPP))
$(D_LIB):$(OBJ)
$(CC) -o $(D_LIB) -lm -lpthread -lc -shared -fPCI $(OBJ) $(LIB)
$(STRIP) -s $(D_LIB)
%.o : %.c
$(CC) $(CFLAGS) -c $<
#CC 使用 GCC
%.o :%.cpp
$(CXX) $(CPPFLAGS) -c $<
#CXX 使用 g++
我为 CPPFLAG 添加了选项,例如 (-fno-rtti -fno-exceptions(,它们不起作用
对于应用程序,由于所有库都是用 c 语言编译的,我在下面制作了我的 makefile:
CFLAGS = -Wall -I$(INC_PATH)/logic ->I$(INC_PATH)/plate
$(BIN):$(OBJ)
$(CC) -o $(BIN) $(OBJ) -Wl,-rpath,$(LD_RUN_PATH) $(LIBS)
%.o : %.c
$(CC) $(CFLAGS) -c $<
我尝试添加一些其他系统库(-ldl -lc(,它不起作用。
PS:当我将此库直接链接到 c 程序时,c ++ 静态库工作得很好。
你需要用 g++ 编译你的共享库。另外,你在 -fPCI 上犯了一个错误。应该是 -fPIC。要么是这样,要么是出于某种奇怪的原因,您在此处重新键入了 Makefile,而不是使用剪切和粘贴。
因此,该行应如下所示:
$(D_LIB):$(OBJ)
$(CXX) -o $(D_LIB) -lm -lpthread -shared -fPIC $(OBJ) $(LIB)
使用 g++ 进行编译会链接C++所需的支持库,并确保包含重要信息,例如类型信息类和异常。
如果您要链接到的C++库使用 RTTI 或例外,则需要链接这些库。在共享对象链接期间给出标志 -fno-rtti 或 -fno-exceptions 只会破坏程序。
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 多线程减慢程序速度:无错误共享,无互斥锁,无缓存未命中,无小工作量
- 在另一台 PC 上执行程序时加载 SDL2 共享库时出错
- 在C++中的程序之间共享指针
- 如何用共享库替换可执行C++程序的功能?
- 读/写 OpenMP 中的共享向量会减慢程序速度
- 如何为包含 protobuf 库的C++程序生成共享库 (.so) 文件
- 在 Linux 上,在 C++ 程序中,如何找到已加载共享库的路径?
- Qt - 共享同一数据库的应用程序
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 如果我在 Linux 上更改C++动态共享库,而我的可执行程序在其上使用,会发生什么
- 使用 IPC 共享内存的应用程序是否可以访问彼此的代码?
- 无法将 C 共享对象链接到C++程序
- 为什么我的程序寻找共享资源.dll而不是Commons.lib
- 给定程序计数器,在共享库中查找源代码行
- 在 API 和应用程序线程之间共享数据
- 如果您用新版本覆盖共享库(当前由程序映射)会发生什么
- 启动程序和libocci.so.11.1:无法打开共享对象文件:没有这样的文件或目录
- 将函数从控制台应用程序移动到共享库项目似乎会带来不相关的编译错误
- 共享对象与提升program_options静态链接;应用程序链接共享