我正在尝试使用g ++ 从Program-Library-HOWTO编译以下简单的DL库示例代码.这只是一个例子,所以我可以学习如何使用和编写共享库.我正在开发的库的真正代码将用C++编写.
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
void *handle;
double (*cosine)(double);
char *error;
handle = dlopen ("/lib/libm.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if ((error = dlerror()) != NULL) {
fputs(error, stderr);
exit(1);
}
printf ("%f\n", (*cosine)(2.0));
dlclose(handle);
}
Run Code Online (Sandbox Code Playgroud)
如果我用gcc编译程序,它工作正常.
gcc -o foo foo.c -ldl
Run Code Online (Sandbox Code Playgroud)
当我将文件名和编译器更改为以下内容时
g++ -o foo foo.cpp -ldl
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
foo.cpp:16:错误:无效转换为'void*'到'double(*)(double)'
我理解(我想我理解,如果这是错的,请纠正我)我不能从C++中的void指针进行隐式转换,但C让我,这就是为什么上面的代码将使用gcc编译而不是使用克++.所以我尝试通过将上面的第16行更改为:
cosine = (double *)dlsym(handle, "cos");
Run Code Online (Sandbox Code Playgroud)
有了这个,我收到以下错误:
foo.cpp:16:错误:在赋值时无法将'double*'转换为'double(*)(double)' …
我正在实现一个像服务器一样的CORBA.每个类都有远程可调用方法和一个带有两个可能输入的调度方法,一个标识方法的字符串或一个整数,它将是表中方法的索引.字符串到相应整数的映射将由映射实现.
调用者将在第一次调用时发送字符串并使用响应返回整数,以便它只需在后续调用时发送整数.这只是一个小优化.可以根据需要由服务器对象动态分配整数.服务器类可以从具有重写的虚拟方法的另一个类派生.
什么是定义方法绑定和调度方法的简单通用方法?
编辑:方法具有相同的签名(没有重载).这些方法没有参数并返回一个布尔值.它们可以是静态的,虚拟的或非静态的,覆盖基类方法与否.绑定必须正确处理方法覆盖.
该字符串是类层次结构绑定.如果我们有由字符串"A.foo"标识的A :: foo(),并且类B继承A并覆盖方法A :: foo(),它仍将被标识为"A.foo",但是如果服务器是A对象,调度程序将调用A :: foo,如果它是B对象,则调用B :: foo.
编辑(6 apr):换句话说,我需要使用动态调度方法实现我自己的虚方法表(vftable),使用字符串键来标识要调用的方法.vftable应该在同一个类的对象之间共享,并且与多态性的行为一样(继承的方法覆盖).
编辑(28 apr):看下面我自己的答案和最后的编辑.
我正在寻找基本的示例/教程:
如何用C++编写/编译库(.soLinux .dll文件,Windows文件).
如何在其他代码中导入和使用这些库.
如果我在 C++ 中使用动态加载打开一个库,我以后可以重新加载该库的更新版本吗?我会自己测试一下,但在我开始研究它作为我正在研究的事情的潜在解决方案之前,我很好奇它的可行性。
以防万一,我在 Linux 上运行。能够使其在其他操作系统上运行会很好,但这不是必需的。
我已经阅读了几篇有关堆栈溢出的文章,并了解了有关在线动态链接的信息。这就是我从所有这些读物中学到的东西-
动态链接是一种优化技术,用于充分利用系统的虚拟内存。一个进程可以与其他进程共享其页面。例如,libc++需要与所有C ++程序链接,而不是将可执行文件复制到每个进程,而可以通过共享的虚拟页面将其动态链接到许多进程。
但是,这导致我以下问题
*.cpp file?lib/ directory with *.a files and *.dylib (on mac-OSX) files. How do I know which ones to link to statically as I would with a regular *.o file and …我必须从一个C++类导入/翻译代码,以便我可以在C程序中使用它.
C程序很大,对C库的开放和封闭都有很多依赖.
C++类.cpp文件是650行
我没有混合使用C和C++的经验,所以尽管我已经看过一个如何做的指南,但我不相信会走哪条路.
我只需要在几个地方使用C++代码(相当孤立的用途
我正在使用gcc(gcc/g ++)
这是一个Linux环境
那么我需要做什么才能导入呢?它会比翻译时间短吗?
谢谢,
麦克风
我从一个示例中的类创建一个共享库,我在这里获得了Linux上的C ++动态共享库。我想从创建的共享库中调用另一个共享库,然后在主程序中使用它。因此,我有myclass.so库,我想从myclass.so库中调用另一个库,例如anotherclass.so,然后在主程序中使用此myclass.so库。请问我如何做到这一点。
我想使用字符串值来调用函数。这可能吗?有人可以展示一些实现吗?我会很感激。
class obj {
int num1;
int num2;
}
int func1(obj o) {
return o.num1 + o.num2;
}
// This is an example data set. This map would be populated with values in the map below with some piece of code.
std::map<std::string, std::string> funcNameMap = {{"func1", "func1"}};
int someFunction(std::string funcName, obj o) {
// Get the value associated with the string "funcName" i.e. "func1".
// Calls function "func1" with value "o" and returns the value.
}
int main(){
obj o; …Run Code Online (Sandbox Code Playgroud)