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

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日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装