我正在做一个项目,主程序用 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++
我为 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++ 静态库工作得很好。