gcc返回“;未定义的引用;编辑库源代码后的函数

gcc返回“;未定义的引用;编辑库源代码后的函数,c,C,我在某个库的.c源代码中添加了一个函数,并在相应的.h文件中添加了函数头,然后安装了整个程序(./configure;make;make install),没有错误 如果我的函数存在于共享库(.so)(由上面的编译生成)中,请使用nm进行检查:它说函数存在于共享库中 编译一个调用自定义函数的程序并将其与库链接时,出现以下错误: 但是,当编译一个程序而不引用我的自定义函数时,它可以正常工作并运行,不会出错 系统:Debian 9 stretch 内存:8GB CPU:Intel(R)C

我在某个库的.c源代码中添加了一个函数,并在相应的.h文件中添加了函数头,然后安装了整个程序(./configure;make;make install),没有错误

  • 如果我的函数存在于共享库(.so)(由上面的编译生成)中,请使用nm进行检查:它说函数存在于共享库中

  • 编译一个调用自定义函数的程序并将其与库链接时,出现以下错误:

    • 但是,当编译一个程序而不引用我的自定义函数时,它可以正常工作并运行,不会出错
    系统:Debian 9 stretch

    内存:8GB

    CPU:Intel(R)Core(TM)i5-4570 CPU@3.20GHz

    图书馆:nftables 9.4(来源)


    gcc(Debian 6.3.0-18+deb9u1)6.3.0 20170516

    nftables库只提供外部可用的特定内容。它通过两种机制完成:

    • 默认可见性
    • 地图文件
    稍微阅读一下源代码,就可以看出控制可见性的文件化机制是一种声明:

    EXPORT_SYMBOL(routine);
    
    它在源文件的
    utils.h
    文件中定义。因此,如果您添加一个:

    EXPORT_SYMBOL(print_hello);
    
    无论是在
    /src/libnftables.c
    中,还是在您声明的文件中,都应该包含可见性


    第二件事是mapfile,它定义了
    .so
    的约定接口,它位于
    libnftables.map
    文件中。您还需要在
    global:
    部分将
    print\u hello
    导出添加到此文件,以便将其导出到库的API中。

    nftables库仅使特定的内容在外部可用。它通过两种机制完成:

    • 默认可见性
    • 地图文件
    稍微阅读一下源代码,就可以看出控制可见性的文件化机制是一种声明:

    EXPORT_SYMBOL(routine);
    
    它在源文件的
    utils.h
    文件中定义。因此,如果您添加一个:

    EXPORT_SYMBOL(print_hello);
    
    无论是在
    /src/libnftables.c
    中,还是在您声明的文件中,都应该包含可见性


    第二件事是mapfile,它定义了
    .so
    的约定接口,它位于
    libnftables.map
    文件中。您还需要在
    global:
    部分将
    print\u hello
    导出添加到此文件,以便将其导出到库的API中。

    您应该包括
    nm
    调用的输出,将其限制在函数的定义中。我猜报告的类型将是
    t
    ,而不是
    t
    ——即库的本地类型,而不是本地类型exported@Petesh:您是对的
    #nm/usr/local/lib/libnftables.so | grep print_hello 0000000000042df0 t print_hello
    我该怎么办?您应该包括
    nm
    调用的输出,仅限于函数的定义。我猜报告的类型将是
    t
    ,而不是
    t
    ——即图书馆的本地类型,而不是exported@Petesh:你说得对
    #nm/usr/local/lib/libnftables.so | grep print_hello 0000000000042df0 t print_hello
    那我该怎么办?谢谢@Petesh导出符号宏肯定是解决方案。谢谢@Petesh导出符号宏肯定是解决方案。