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这个宏引起的,请教一下是否有使用过该库并尝试自己编译动态库的分享一下经验,谢谢

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

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)来生成动态库,以便更好地管理依赖关系和编译选项。

在编译生成动态库时出现 "multiple definition" 错误,这通常是因为在多个目标文件中存在相同的函数定义。这个问题可能与宏定义有关,但不一定是BACNET_STACK_EXPORT这个宏引起的。

为了解决这个问题,可以考虑以下几个方面:

确认是否在多个源文件中定义了相同的函数。如果是这种情况,需要将这些定义合并到一个文件中,或者将函数定义改为static,以限制其作用域。
确认是否在头文件中定义了函数实现。如果是这种情况,需要将函数定义从头文件中删除,并将其放在C文件中。
确认是否正确使用了extern关键字。如果在头文件中使用了extern关键字来声明函数,但是在C文件中没有使用extern关键字来实现函数,也可能会导致"multiple definition"错误。
确认是否正确使用了宏定义。如果BACNET_STACK_EXPORT宏定义的方式不正确,也可能会导致编译错误。在动态库的情况下,需要将宏定义为导出符号,以便在其他程序中使用。
下面是一些可能的解决方法:

将BACNET_STACK_EXPORT宏定义为导出符号,在Makefile中添加以下选项:
-fvisibility=hidden -DBACNET_STACK_EXPORT=attribute((visibility("default")))
在C文件中使用extern关键字来声明函数,而不是在头文件中使用。
将函数定义放在一个文件中,并在头文件中声明。
将函数定义改为static,以限制其作用域。
希望这些方法能够帮助您解决问题。如果还有其他问题,请随时问我。