Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中使用dlsym+;“没有外部的”;";_C++_G++ - Fatal编程技术网

C++ 在c+中使用dlsym+;“没有外部的”;";

C++ 在c+中使用dlsym+;“没有外部的”;";,c++,g++,C++,G++,我有一个系统,我给用户一个功能原型,用户必须实现它。现在,我使用g++编译这个文件,并使用dlopen和dlsym动态加载它以进一步处理它。现在,我在这里读到: < >加载C++函数时,我们必须在函数之前使用EXTEN“C”。现在,问题是,我不想向用户展示事情是如何运作的。我不想在函数之前显示用户外部“C” 有什么办法可以避免吗?你可以直接使用这个名字 如果你有一个C++函数 Vo.MyPuxin(int fo),C++编译器会把这个名字加错。 一旦知道了损坏的函数名,就可以对该名称使用dlo

我有一个系统,我给用户一个功能原型,用户必须实现它。现在,我使用g++编译这个文件,并使用dlopen和dlsym动态加载它以进一步处理它。现在,我在这里读到:

< >加载C++函数时,我们必须在函数之前使用EXTEN“C”。现在,问题是,我不想向用户展示事情是如何运作的。我不想在函数之前显示用户外部“C”

有什么办法可以避免吗?

你可以直接使用这个名字

如果你有一个C++函数<代码> Vo.MyPuxin(int fo),C++编译器会把这个名字加错。 一旦知道了损坏的函数名,就可以对该名称使用dlopen()

e、 g

这里我们的函数名为Z9my_plugini,您可以

 func = dlsym(handle, "_Z9my_plugini");
传统上不同的编译器会以不同的方式来修改名称,所以这可能是相当脆弱的,因为现在大多数C++编译器都会将OPN标准化为在给定平台上对名字进行篡改的标准方法。
但是,您的用户将是程序员,他们通常会理解将条目作为
extern“C”

公开到动态加载的库中,在每个声明使用块样式语法之前,
extern“C”
的另一种替代方法是:

extern "C" {

void my_callback();
int other_functionality( foo * );

}
通常,
extern“C”{
和右大括号
}
被包装在宏中,这些宏以
\uucplusplus
内置宏为条件,因此标题也可以从纯C中使用。这也封装了您认为不合适的部分


无论如何,我看不出有什么大不了的。如果用户可以用C++编写,那么当库文档告诉他们时,他们应该能够在C++中编写C接口函数原型,

< p>。既然你使用C++,为什么不只导出一个(或两个)函数,只返回一个纯虚拟类的指针,说
IMyModule
?导出的一(或两)个
extern“C”
函数类似于
extern“C”IMyModule*create_instance_IMyModule()
(和
extern“C”void delete_instance_IMyModule(IMyModule const*);
)。

是否将
extern“C”
隐藏在预处理器宏中的某个位置?或者修改他们提供给您的源代码以包含
外部“C”
?你没有给我们足够的信息来回答这个问题,但这应该一点也不难。看到一些代码将有助于理解您正在做的事情。是的,只需给出损坏的名称,而不是“C”样式的名称。类似于
Z4MyFunc_iii
或其他任何东西,而不是
MyFunc
。但是我不明白为什么你不能在函数前面说“你需要这个神奇的计算”
extern“C”
。你不想让用户看到
extern“C”
,或者你不想要求用户自己写?这到底是怎么回事?这个问题很模糊。什么?您想给用户一个要实现的原型,但不想显示正确的原型?为什么您愿意显示返回类型,而不显示外部“C”?1。不,没有一个标准的弄乱方案,也没有任何一个使其收敛的方法。2.新的C++11和C++1y特性意味着破坏方案往往会出现分歧。3.他说,这样做的动机是避免向用户公开内部工作。不确定这意味着什么,但这不是。@ PATATOSWATER,而我同意使用这样一个C++的名字是愚蠢的,有平台,有一个C++ ABI标准化名字的名字。有平台ABIs,但没有覆盖当前指定的所有特征。在某些情况下,即使是GCC也会打印错误消息“internal error:抱歉,无法处理此问题”。您给出的第一个解决方案不起作用。我们使用的是同一个编译器。@Rishi你的意思是你没有使用同一个编译器?不,我们使用的是同一个编译器。@Rishi抱歉,我分心了,忘了链接器没有处理符号名。那一段只是无关的。。。。您还可以提供一个宏,如
EXPORT\u MODULE
,或一些类似的宏,这些宏将扩展到这些模块,用户无需在意。他们将实现接口并在实现文件中写入宏,就这样。
extern "C" {

void my_callback();
int other_functionality( foo * );

}