Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用在不同文件中定义的回调函数会给出;“未定义引用”;_C_Callback - Fatal编程技术网

C 使用在不同文件中定义的回调函数会给出;“未定义引用”;

C 使用在不同文件中定义的回调函数会给出;“未定义引用”;,c,callback,C,Callback,我正在尝试使用回调函数。当调用方和被调用函数位于同一个文件中时,这种方法工作得很好。我最近决定让被调用的函数成为库的一部分,因此我在头文件中声明了它,并在它自己的文件中定义。我#在调用源文件中包含新头,链接到新库,现在我得到了回调函数的“Undefined reference”错误 有什么特别的事情我必须做,使这项工作?我注意到,例如,当我在pthread库中使用相同的东西时,回调函数被定义为指针函数 编辑:我正在链接到库,我可以调用库中的其他函数 您需要链接到实现回调的实际代码,包括头是不够的

我正在尝试使用回调函数。当调用方和被调用函数位于同一个文件中时,这种方法工作得很好。我最近决定让被调用的函数成为库的一部分,因此我在头文件中声明了它,并在它自己的文件中定义。我#在调用源文件中包含新头,链接到新库,现在我得到了回调函数的“Undefined reference”错误

有什么特别的事情我必须做,使这项工作?我注意到,例如,当我在pthread库中使用相同的东西时,回调函数被定义为指针函数


编辑:我正在链接到库,我可以调用库中的其他函数

您需要链接到实现回调的实际代码,包括头是不够的

因此,听起来您的应用程序需要链接到库,当然,为了调用库中的函数,它已经在这样做了。

可能的问题:

  • 函数的定义(在.c文件中)与其声明(在.h文件中)不一致,使用此函数的代码本质上告诉链接器去查找头文件中的内容,而不是库中的实际内容

  • 您忘记编译实现函数的文件,或者将生成的对象文件放入库中,因此链接器无法在库中找到函数

  • 有些源文件已打开且未保存,虽然它们在编辑器中看起来很好且完整,但它们在磁盘上的内容不同,并且在尝试编译代码时出现了一些问题

  • 您在
    make
    (错误的makefile?)。修复makefile和/或删除对象和库文件将解决此问题

  • <> >你已经混合了C和C++代码,因为C++名字的限制而有问题。在这里使用
    extern“C”{}
    可能会有所帮助

  • 您已将该函数定义为
    static
    ,因此它在链接时在其他模块(.c文件)中不可见。删除
    static
    会有所帮助


  • 原来问题是我的头中有两次定义,一次有静态,一次没有。

    我正在链接包含回调的库。回调是否可能声明为
    static
    ?否,如果要从外部调用,它不能是
    static
    。如果声明为
    静态
    ,它将不可见,也不会导出任何符号。那么,
    nmyourlib | grep callback_name
    是否给出了任何提示?我不知道该函数存在。我在包含回调函数的库中运行了它,回调函数出现了。这很奇怪-虽然它与它是一个回调参数这一事实有关,但我只是将回调函数改为库中的另一个函数,它编译得很好-它只是实际的回调函数,导致problemEdited问题包括我正在链接的问题。我可以调用库中的其他函数。