我有一个接受函数指针作为参数的函数,并调用函数指针,如下所示。
int foo (int a, int(*calc)(int))
{
int y;
// ....
// calling calc function via callback
(*calc)(y);
}
要回调的calc函数看起来像
int calc(int x)
{
// ....
cout << x;
checkValue(x);
}
函数foo
放在a.cpp
中,函数calc()
和checkValue()
在文件b.cpp
和c.cpp
中定义。我的问题是calc()
在cout
语句之前执行正常,并且无法调用checkValue()
函数。我收到的崩溃报告是:
symbol lookup error:..... undefined symbol: _ZNSaIcEC1Ev, version GLIBCXX_3.4
我该如何解决这个问题?
答案 0 :(得分:0)
#include <iostream>
using namespace std;
int calc(int x){
cout<< "calc:" << x << endl;
}
int CALC(int x) {
cout << "CALC: " << x << endl;
}
int foo (int a, int(*callback)(int)){
cout << "Calling calc on:" << a << endl;
(*callback)(a);
}
int main() {
cout << "START" << endl;
foo(5, calc);
foo(6, CALC);
}
这对我来说很好。
gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.9.00)
注意:我删除了你的“checkValue(x)”电话,问题可能就在那里......
答案 1 :(得分:0)
符号_ZNSaIcEC1Ev
是std::allocator<char>::allocator()
零参数构造函数的错位名称(我使用c++filt(1)
程序确定了这一点)。错误消息“symbol lookup error:..... undefined symbol
”与动态链接有关,与通过函数指针调用函数无关。
你的错误几乎肯定在其他地方。由于 stdout缓冲,你可能会对错误的位置感到困惑 - 字符串被打印到stdout,但是你没有看到它们出现,因为它们被缓冲在内存中,然后程序在显示之前崩溃。为避免这种情况,您需要确保在每个print语句后刷新输出(例如,通过插入std::cout << std::endl
或std::cout << std::flush
或显式调用std::cout.flush()
),或使用std::cerr
而不是std::cout
,默认情况下是无缓冲的。