【问题标题】:Using C++ shared library from C从 C 中使用 C++ 共享库
【发布时间】:2015-01-10 01:21:42
【问题描述】:

我有一个从我的 C 应用程序中使用的 C 库,带有 dlopendlsym。 一切正常,但我将 C 库重写为 C++,现在我的主应用程序停止使用该库。

找不到符号(函数),即使代码完全一样,只是我改变了我的编译方法。

这就是我之前获得 lib 的方式:

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
    $(CC) $^ -o $@ -shared

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.c
    $(CC) -c $< -o $@ -pedantic -g -Wall -std=gnu99 -fpic -I.

这就是我现在得到它的方式:

$(PLUGINS_DIR)/%.so: $(PLUGINS_DIR)/%.o
    $(CPP) $^ -o $@ -shared

$(PLUGINS_DIR)/%.o: $(PLUGINS_DIR)/%.cpp
    $(CPP) -c $< -o $@ -pedantic -g -Wall -fPIC -I.

我应该如何编译 mmy C++ 库以便可以在我的 C 代码中使用它?

【问题讨论】:

  • 基本不行,为什么要把库改成C++
  • 您需要在函数声明/定义周围添加extern "C" { ... }。见:stackoverflow.com/questions/1041866/…
  • @Galik 这是做什么的? “外部”包装内的代码仍然是 C++ 吗?
  • 所有extern "C" 所做的只是让编译器为函数使用C 语言符号名称(C++ 破坏了名称)。你仍然可以使用 C++,除非可能不是函数重载。
  • 当您从 C 中使用 C++ 代码时,理想情况下您应该有一个 C++ main 以便完成 C++ 特定的初始化。

标签: c++ c gcc shared-libraries


【解决方案1】:

这是因为名称修饰,函数名称在 c++ 中被修饰以提供函数重载,如果您需要在 c 中使用这些函数,请使用 extern "C" 声明函数,这样编译器就不会修饰函数的名称。

所以为函数void function() {}添加这个原型

extern "C" void function();

会的。而且我假设您可以弄清楚如何修复其他功能。

【讨论】:

  • 所以,假设我的 C++ 库中有一个名为 XYZ 的函数,我添加了这个 extern "C" 包装。尽管从我的 C 程序中调用了该函数,我仍然可以在 XYZ 函数中使用 C++ 代码吗?
  • @alexander:是的。但是,您不能导出重载函数,因为 C 不支持。
  • 听起来很合理。酷,这就是我想要的!谢谢,我会尽快接受作为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
  • 2019-04-30
  • 2017-10-21
相关资源
最近更新 更多