未定义对函数c的引用

用户

这个问题也许以前曾被问过。我无法尽我所能找到它。

我正在尝试链接libpfm4.5.0我的代码。我正在使用的头文件如下:perf_util.h

这是下载libpfm4.5.0的链接

我到底在哪里包含头文件有关系吗?

这是我的代码片段:

#include "matrix.h"
#include "perf_util.h"

int read_counts(int pid, int app_num){
    int ret, i, num_fds = 0, grp, group_fd;
    int ready[2], go[2];
    char buf;
    int nevents;

    nevents = TOTAL_NUM_EVENTS;
    go[0]=go[1] = -1;

    for (grp = 0; grp < nevents; grp++) {
        int ret;
        ret = perf_setup_list_events(perf_events.pmc[grp], &fds_pid[app_num], &num_fds);
        if (ret || !nevents)
            exit(1);
    }
   }

头文件perf_util.h确实包含perf_setup_list_events功能,但是在编译过程中

matrix.o: In function `read_counts(int, int)':
matrix.c:(.text+0xf20): undefined reference to `perf_setup_list_events(char const*, perf_event_desc_t**, int*)'
collect2: error: ld returned 1 exit status

这是我得到的错误。我可能在哪里做过错误?任何帮助,将不胜感激。

这就是我的编译方式。

g++ -I. -I/libpfm-4.5.0/perf_examples/../include -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -I. -D_GNU_SOURCE -pthread -w -c matrix.c
g++ -I. -I/libpfm-4.5.0/perf_examples/../include -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -I. -D_GNU_SOURCE -pthread -w -o matrix matrix.o perf_util.o /libpfm-4.5.0/perf_examples/../lib/libpfm.a 

注意:libpfm使用cc编译g++可能是问题所在吗?如果是,我该如何解决?

这是我现在的编译方式:

cc -std=c99 -I. -I/libpfm-4.5.0/perf_examples/../include -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -I. -D_GNU_SOURCE -pthread -w -c matrix.c 
cc -std=c99 -I. -I/libpfm-4.5.0/perf_examples/../include -DCONFIG_PFMLIB_DEBUG -DCONFIG_PFMLIB_OS_LINUX -I. -D_GNU_SOURCE -pthread -w -o matrix matrix.o perf_util.o libpfm-4.5.0/perf_examples/../lib/libpfm.a 


error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token 
const char * pmc[TOTAL_NUM_EVENTS] = {"blah", "blahbar"}

我有一个const char * array,这是我得到的错误。

肿胀

好的,所以,与我最初的想法相反,您的程序C ++程序。我们知道是这种情况,因为C ++编译器接受它,而C编译器不接受。(您仍然没有提供足够的信息让我理解为什么C编译器不喜欢它,但是我怀疑这有点无趣,例如定义了无法在编译时完全初始化的文件作用域变量。这是一个C程序,无论如何,您应该提出一个新的问题。)

您使用的库是C,而不是C ++,并且其头文件未设置为可以在C ++程序中使用。我从错误消息中推断出这是问题所在:

undefined reference to `perf_setup_list_events(char const*, perf_event_desc_t**, int*)'

看到该错误消息如何为该函数提供完整的原型perf_setup_list_events这是因为C ++具有函数重载,而C没有-因此,在C ++中,每个函数都被赋予一个“混杂名称”,用于编码其原型。如果这样做,nm matrix.o | grep perf_setup_list_events您会发现这个名称不正确:可能类似于_Z22perf_setup_list_eventsPKcPP17perf_event_desc_tPi链接器会再次将其解码为原型。

因此,该连接错误有一个完整的原型,其实所有的本身,告诉我,未定义的引用是编译为C ++代码。现在,我从未听说libpfm4.5.0过,但是我确实知道,如果您的库实际上没有定义该函数,您将收到一条不同的错误消息-类似于

错误:未在此范围内声明“ perf_setup_list_events”

因此,我猜想该库是用C而不是C ++编写的,并且其头文件未编写为处理C ++程序正在使用的文件。这是库中的一个缺陷,但是可以通过编写来解决

extern "C" {
#include "perf_util.h"
}

不仅仅是光秃秃的#includeextern "C" { ... }构造告诉C ++编译器不要对其中声明的内容应用名称修饰。因此,以这种方式编译时,您的程序将查找名为的符号perf_setup_list_events_Z22perf_setup_list_eventsPKcPP17perf_event_desc_tPi并且它成功链接。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

未定义对函数的引用?C ++

来自分类Dev

C ++:对构造函数的未定义引用

来自分类Dev

未定义的函数引用(C ++)

来自分类Dev

C ++:对void函数的未定义引用

来自分类Dev

对C ++中函数的未定义引用

来自分类Dev

对C ++中函数的未定义引用

来自分类Dev

在C ++代码中对C函数的未定义引用

来自分类Dev

使用混合C和C ++的函数的未定义引用

来自分类Dev

混合 C 和 C++... 未定义的函数引用

来自分类Dev

C ++未定义的引用

来自分类Dev

C ++类模板对函数的未定义引用

来自分类Dev

中间目标文件抛出的对函数c ++的未定义引用

来自分类Dev

C ++未定义对具有队列参数的函数的引用

来自分类Dev

c ++-对现有函数的未定义引用

来自分类Dev

在C程序中未定义对函数的引用

来自分类Dev

c ++对默认构造函数的未定义引用

来自分类Dev

在函数中未定义的引用 c++

来自分类Dev

C++ 对库函数的未定义引用

来自分类Dev

GetPhysicallyInstalledMemory 函数 - C 中未定义的引用

来自分类Dev

对定义的构造函数的“未定义引用”

来自分类Dev

对定义的构造函数的“未定义引用”

来自分类Dev

对已定义函数的未定义引用

来自分类Dev

未定义对函数调用的引用?

来自分类Dev

未定义对函数send的引用

来自分类Dev

未定义对swscale函数的引用

来自分类Dev

未定义对'gnutls _...'函数的引用

来自分类Dev

未定义对模板成员函数的引用

来自分类Dev

未定义对某些opencv函数的引用

来自分类Dev

未定义的函数错误引用