【问题标题】:Linux C program using shared libs written in c/c++使用 c/c++ 编写的共享库的 Linux C 程序
【发布时间】:2012-05-19 17:39:31
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 我通过添加包含的 -lstdc++ 库对 c 程序进行了更改。感谢 -fPCI 错误,它永远不会出现错误。而且我没有将 g++ 用于 lib 链接(只有 cpp 文件使用 g++),结果证明没问题。所以你在共享对象期间对标志 -fno-rtti 的建议会破坏程序,我不确定。还是谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-21
    • 2014-09-08
    • 1970-01-01
    相关资源
    最近更新 更多