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

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

所有c静态库都对我有用,当使用c++库时,我的库编译良好,但是链接到我的应用程序时会出现2个错误:



这是用于编译此共享库的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++静态lib可以正常工作。

最佳答案

您需要使用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标志只会使程序中断。

10-07 19:17
查看更多