我正在做一个项目,主程序用C编写,它在嵌入式Linux系统上.在另一家公司提供的硬件上,我得到了它们的库(使用c和c语言的静态库).为了以后移植到其他设备,我制作了新的库(共享库)以与使用c语言的应用程序链接,即:their ...

我正在做一个项目,主程序用C编写,它在嵌入式Linux系统上.在另一家公司提供的硬件上,我得到了它们的库(使用c和c语言的静态库).为了以后移植到其他设备,我制作了新的库(共享库)以与使用c语言的应用程序链接,即:
their libs(static libs,c/c++) --> my libs(shared libs,c) --> my applications(c).
所有c静态库都对我有用,当使用c库时,我的库编译良好,但是链接到我的应用程序时会出现2个错误:
libplate.so: undefined reference to
operator delete(void*)
libplate.so: undefined reference tovtable 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
我为CPPFLAGS添加了选项,例如(-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只会破坏程序.
本文标题为:使用C/C++编写的共享库的Linux C程序


- C语言手把手带你掌握带头双向循环链表 2023-04-03
- C++ 数据结构超详细讲解顺序表 2023-03-25
- ubuntu下C/C++获取剩余内存 2023-09-18
- C语言详解float类型在内存中的存储方式 2023-03-27
- C语言qsort()函数的使用方法详解 2023-04-26
- Qt计时器使用方法详解 2023-05-30
- 详解C语言中sizeof如何在自定义函数中正常工作 2023-04-09
- c++ const 成员函数,返回一个 const 指针.但是返回的指针是什么类型的 const? 2022-10-11
- 我应该为我的项目使用相对包含路径,还是将包含目录放在包含路径上? 2022-10-30
- Easyx实现扫雷游戏 2023-02-06