带有外部“ C ++”函数调用的链接器错误:用法不常见

时间:2018-07-19 20:53:50

标签: c++ c linker-errors new-operator extern

我想演示我的项目的一小部分示例,在该示例中,访问外部extern“ C ++”定义的函数时收到Linker错误。如果我的项目同时允许C和C ++链接,那么访问此功能的最佳方法是什么?

///文件名:new

#include <cstdlib>
#include <exception>

extern "C++" {
namespace std
{
  typedef void (*new_handler)();
  new_handler set_my_handler(new_handler) throw();
}

///文件名:main.c

extern void handler();

void main() 
{
  handler(); 
}

///文件名:App.cpp

#include <new>

static App objApp;
void no_memory()
{
  // exit
}

void App::init()
{
  using namespace std;
  set_my_handler(no_memory);
} 

extern "C" void handler()
{
  objApp.init();
}

我收到以下链接器错误:

  

../../ obj / output / stm32-debug / Project / App.o:在函数App :: init()中:对set_my_handler(void(*)())的未定义引用

在库中,较早的“ set_my_handler”被定义为extern“ C”,但现在其extern“ C ++”。我还没有看到过多使用extern“ C ++”来限制仅从C ++链接进行的调用。但是在我的项目中,我有一个C函数,该函数最终访问在外部“ C ++”下描述的C ++函数。好奇链接器为何如上所述哭泣。

  

观察:如果我不调用objApp.init()[即将此行注释掉]我不   得到任何链接器错误。问题与从C到C的呼叫流有关   C ++函数标记为extern“ C ++”。

0 个答案:

没有答案