今年真减肥 2023-02-16 14:20 采纳率: 35.7%
浏览 33
已结题

BACnet-stack v1.0.0库编译问题

使用src目录下的Makefile,添加命令编译生成静态库,能够正确编译并生成,改为生成动态库,在编译时报错:
multiple definition of `x',这里x代表函数,查看文件,这些函数都只有在C文件中存在一份定义,头文件中有如下的声明:

BACNET_STACK_EXPORT
    int bvlc_encode_address(
        uint8_t *pdu, uint16_t pdu_size, const BACNET_IP_ADDRESS *ip_address);

不太清楚是否是由于BACNET_STACK_EXPORT这个宏引起的,请教一下是否有使用过该库并尝试自己编译动态库的分享一下经验,谢谢

  • 写回答

2条回答 默认 最新

  • zmy1127 2023-02-16 18:54
    关注

    根据您提供的信息,问题似乎与符号重复定义有关。这可能是因为在编译生成动态库时,同一个符号在多个目标文件中被定义了多次,导致链接错误。

    BACNET_STACK_EXPORT宏的定义可能与此有关。您可以查看宏的定义,确认是否将函数定义为"extern"以便在多个源文件中使用,例如:

    
    #if defined(_MSC_VER)
    #define BACNET_STACK_EXPORT __declspec(dllexport)
    #else
    #define BACNET_STACK_EXPORT extern
    #endif
    
    

    如果这个宏已经定义为"extern",那么问题可能是由于您的Makefile没有正确地链接库。在生成动态库时,需要使用-fPIC选项生成位置无关代码,并将生成的目标文件链接到动态库中。您可以尝试使用以下命令编译生成动态库:

    
    gcc -shared -fPIC -o libbacnet.so *.o
    
    

    其中,*.o是所有编译生成的目标文件的通配符。

    如果您已经使用了类似的命令,但仍然遇到问题,建议您检查Makefile中的相关规则和选项,以确认是否正确地链接了库,并正确地编译了源代码。您也可以尝试使用其他工具链(如CMake)来生成动态库,以便更好地管理依赖关系和编译选项。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月25日
  • 已采纳回答 2月17日
  • 创建了问题 2月16日

悬赏问题

  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 dy网页ck不扫码解决方法
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!
  • ¥15 matlab生成的x1图不趋于稳定,之后的图像是稳定的水平线
  • ¥15 请问华为OD岗位的内部职业发展通道都有哪些,以及各个级别晋升的要求
  • ¥20 微信小程序 canvas 问题
  • ¥15 系统 24h2 专业工作站版,浏览文件夹的图库,视频,图片之类的怎样删除?
  • ¥15 怎么把512还原为520格式
  • ¥15 MATLAB的动态模态分解出现错误,以CFX非定常模拟结果为快照