将库中定义的函数名作为C中的函数指针传递

将库中定义的函数名作为C中的函数指针传递,c,function-pointers,C,Function Pointers,我想开发一个库,其中定义了不同的算法,以及一个函数处理程序,它可以获取定义了算法的函数的名称并调用它。 这是源文件(imp_GE_s.c): 这是头文件(imp_GE_s.h): 但是每次我用这个命令编译主文件时,我都会得到以下错误 函数“main”中的: 示例_GE_s.c:(.text+0x186):对“LU_kij_nonBlocked”的未定义引用 /usr/lib64/gcc/x86_64-suse-linux/7/../../../../../../x86_64-suse-linux

我想开发一个库,其中定义了不同的算法,以及一个函数处理程序,它可以获取定义了算法的函数的名称并调用它。 这是源文件(
imp_GE_s.c
):

这是头文件(
imp_GE_s.h
):

但是每次我用这个命令编译主文件时,我都会得到以下错误

函数“main”中的
:
示例_GE_s.c:(.text+0x186):对“LU_kij_nonBlocked”的未定义引用
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../../../x86_64-suse-linux/bin/ld:example_GE_s.c:(.text+0x18b):未定义对“函数处理程序”的引用

collect2:错误:ld返回1退出状态

有大量警告,您应该注意,例如控件到达非无效函数的末尾。无论如何,您的问题源于未链接源C文件。您需要像下面这样编译

gcc main.c imp_GE_s.c -o exec
另外,正如和其他C专家所说,将警告视为错误

我命名为CanRemove2.C的主文件 事实上,当你使用。必须像下面这样使用,我看你们并没有问更多关于铸造(浮动**),但这将是一个问题

int main()
{
    int i,j;
    float A[4][4] = {{1,2,3,4},{2,3,4,5},{3,4,6,8},{2,5,7,9}};
    float L[4][4] = {0};
    float U[4][4] = {0};
    float **AA=(float**)malloc(sizeof(float*)*4);
    float **LL=(float**)malloc(sizeof(float*)*4);
    float **UU=(float**)malloc(sizeof(float*)*4);
    for(i=0;i<4;i++){
        AA[i]=(float*)malloc(sizeof(float)*4);
        LL[i]=(float*)malloc(sizeof(float)*4);
        UU[i]=(float*)malloc(sizeof(float)*4);
        for(j=0;j<4;j++){
            AA[i][j]=A[i][j];
            LL[i][j]=L[i][j];
            UU[i][j]=U[i][j];
        }
    }

    printf ("time of operation = %lf \n",   func_handler((*LU_kij_nonBlocked),AA,LL,UU));

    for(i=0;i<4;i++){
        free(AA[i]);
        free(LL[i]);
        free(UU[i]);
    }
    free(AA);
    free(LL);
    free(UU);
}

gcc CanRemove2.c CanRemove333.c-o Rmmm

//令吉


结果操作时间=1.000000

您认为imp_GE_s.c是如何编译的?不相关的提示:
typedef
为了可读性起见,您的函数指针类型。最好的解决方案是获得一个IDE,在其中包含所有文件,并让它担心链接问题。命令行链接、制作文件等都是过去的事了。这个问题的标题是“独自环球飞行”,问题的要点是“如何启动飞机”
#include "imp_GE_s.h"

int main()
{
   float A[4][4] = {{1,2,3,4},{2,3,4,5},{3,4,6,8},{2,5,7,9}};
   float L[4][4] = {0};
   float U[4][4] = {0};

   printf ("time of operation = %d \n",   func_handler((*LU_kij_nonBlocked),A,L,U));
}
gcc main.c imp_GE_s.c -o exec
#include "CanRemove333.h"

int main()
{
   float A[4][4] = {{1,2,3,4},{2,3,4,5},{3,4,6,8},{2,5,7,9}};
   float L[4][4] = {0};
   float U[4][4] = {0};

   printf ("time of operation = %lf \n",   func_handler((*LU_kij_nonBlocked),(float**)A,(float**)L,(float**)U));
}
int main()
{
    int i,j;
    float A[4][4] = {{1,2,3,4},{2,3,4,5},{3,4,6,8},{2,5,7,9}};
    float L[4][4] = {0};
    float U[4][4] = {0};
    float **AA=(float**)malloc(sizeof(float*)*4);
    float **LL=(float**)malloc(sizeof(float*)*4);
    float **UU=(float**)malloc(sizeof(float*)*4);
    for(i=0;i<4;i++){
        AA[i]=(float*)malloc(sizeof(float)*4);
        LL[i]=(float*)malloc(sizeof(float)*4);
        UU[i]=(float*)malloc(sizeof(float)*4);
        for(j=0;j<4;j++){
            AA[i][j]=A[i][j];
            LL[i][j]=L[i][j];
            UU[i][j]=U[i][j];
        }
    }

    printf ("time of operation = %lf \n",   func_handler((*LU_kij_nonBlocked),AA,LL,UU));

    for(i=0;i<4;i++){
        free(AA[i]);
        free(LL[i]);
        free(UU[i]);
    }
    free(AA);
    free(LL);
    free(UU);
}
#ifndef IMP_GE_S
 #define IMP_GE_S

  #include <stdlib.h>
  #include <stdio.h>
  #include <math.h>
  #include <time.h>

  void LU_kij_nonBlocked(float** , float** , float** );
  void LU_kji_nonBlocked(float** , float** , float** );
  double func_handler(void (*)(float**, float**, float**), float** , float** , float** );

#endif
#include "CanRemove333.h"

// This is a function handler developed to get name of a functions as 
// function pointer and call the desired function 
double func_handler(void (*func)(float**, float**, float**), float** A, float** L, float** U)
{
   // call the function and do sth
    return 1.0;
}


// non-blocked KJI form of GE with column pivoting 
void LU_kij_nonBlocked(float** A, float** L, float** U)
{
   //some statements
}


// non_blocked JKI form of GE with column pivoting 
void LU_kji_nonBlocked(float** A, float** L, float** U)
{
   //some statements
}