Linux C程序使用用c / c ++编写的共享库

时间:2012-05-11 05:44:25

标签: c++ c linux makefile shared-libraries

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

 their libs(static libs,c/c++) --> my libs(shared libs,c) --> my applications(c).

所有c静态库对我来说都很有用,在使用c ++库时,我的libs编译得很好,但链接到我的应用程序时会出现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:当我将这个lib直接链接到c程序时,c ++ static lib工作正常。

1 个答案:

答案 0 :(得分:4)

您需要使用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只会破坏程序。