gpt4 book ai didi

c++ - 对函数 c 的 undefined reference

转载 作者:行者123 更新时间:2023-11-30 20:40:01 27 4
gpt4 key购买 nike

这个问题可能以前已经被问过。我尽了最大努力也找不到它。

我正在尝试链接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 的完整原型(prototype)?这是因为 C++ 具有函数重载,而 C 没有——因此,在 C++ 中,每个函数都被赋予一个“损坏的名称”,用于对其原型(prototype)进行编码。如果你这样做nm matrix.o | grep perf_setup_list_events 您会发现这个损坏的名称:它可能类似于 _Z22perf_setup_list_eventsPKcPP17perf_event_desc_tPi。链接器有助于将其再次解码为原型(prototype)。

因此,链接器错误有一个完整的原型(prototype),本身,这一事实告诉我 undefined reference 来自编译为 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 的符号,并且链接成功。

关于c++ - 对函数 c 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602178/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com