相关疑难解决方法(0)

使用g ++进行动态共享库编译

我正在尝试使用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)' …

c++ linux g++ shared-libraries

12
推荐指数
2
解决办法
2万
查看次数

C++中的动态绑定

我正在实现一个像服务器一样的CORBA.每个类都有远程可调用方法和一个带有两个可能输入的调度方法,一个标识方法的字符串或一个整数,它将是表中方法的索引.字符串到相应整数的映射将由映射实现.

调用者将在第一次调用时发送字符串并使用响应返回整数,以便它只需在后续调用时发送整数.这只是一个小优化.可以根据需要由服务器对象动态分配整数.服务器类可以从具有重写的虚拟方法的另一个类派生.

什么是定义方法绑定和调度方法的简单通用方法?

编辑:方法具有相同的签名(没有重载).这些方法没有参数并返回一个布尔值.它们可以是静态的,虚拟的或非静态的,覆盖基类方法与否.绑定必须正确处理方法覆盖.

该字符串是类层次结构绑定.如果我们有由字符串"A.foo"标识的A :: foo(),并且类B继承A并覆盖方法A :: foo(),它仍将被标识为"A.foo",但是如果服务器是A对象,调度程序将调用A :: foo,如果它是B对象,则调用B :: foo.

编辑(6 apr):换句话说,我需要使用动态调度方法实现我自己的虚方法表(vftable),使用字符串键来标识要调用的方法.vftable应该在同一个类的对象之间共享,并且与多态性的行为一样(继承的方法覆盖).

编辑(28 apr):看下面我自己的答案和最后的编辑.

c++ methods binding

10
推荐指数
1
解决办法
2554
查看次数

编写/使用C++库

我正在寻找基本的示例/教程:

  1. 如何用C++编写/编译库(.soLinux .dll文件,Windows文件).

  2. 如何在其他代码中导入和使用这些库.

c++

9
推荐指数
1
解决办法
7345
查看次数

在 C++ 中使用动态加载重新加载库

如果我在 C++ 中使用动态加载打开一个库,我以后可以重新加载该库的更新版本吗?我会自己测试一下,但在我开始研究它作为我正在研究的事情的潜在解决方案之前,我很好奇它的可行性。

以防万一,我在 Linux 上运行。能够使其在其他操作系统上运行会很好,但这不是必需的。

c++ dynamic-loading dlopen

6
推荐指数
1
解决办法
2674
查看次数

动态链接如何工作,其用法以及创建dylib的方式和原因

我已经阅读了几篇有关堆栈溢出的文章,并了解了有关在线动态链接的信息。这就是我从所有这些读物中学到的东西-

动态链接是一种优化技术,用于充分利用系统的虚拟内存。一个进程可以与其他进程共享其页面。例如,libc++需要与所有C ++程序链接,而不是将可执行文件复制到每个进程,而可以通过共享的虚拟页面将其动态链接到许多进程。

但是,这导致我以下问题

  1. 编译C ++程序时。它需要引用C ++库函数和代码(例如,线程库的代码)。编译器如何使可执行文件具有这些引用?这是否不会导致编译器和操作系统之间的循环依赖?由于编译器必须在可执行文件中引用动态库。
  2. How and when would you use a dynamic library? How do you make one? What is the specific compiling command that is used to produce such a file from a standard *.cpp file?
  3. Usually when I install a library, there is a 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++ linux compiler-construction linker dynamic-linking

5
推荐指数
1
解决办法
1303
查看次数

在C程序中使用单个C++类的最佳方法

我必须从一个C++类导入/翻译代码,以便我可以在C程序中使用它.

C程序很大,对C库的开放和封闭都有很多依赖.

C++类.cpp文件是650行

我没有混合使用C和C++的经验,所以尽管我已经看过一个如何做的指南,但我不相信会走哪条路.

我只需要在几个地方使用C++代码(相当孤立的用途

我正在使用gcc(gcc/g ++)

这是一个Linux环境

那么我需要做什么才能导入呢?它会比翻译时间短吗?

谢谢,

麦克风

c c++

4
推荐指数
5
解决办法
693
查看次数

在另一个共享库中使用共享库

我从一个示例中的类创建一个共享库,我在这里获得了Linux上的C ++动态共享库。我想从创建的共享库中调用另一个共享库,然后在主程序中使用它。因此,我有myclass.so库,我想从myclass.so库中调用另一个库,例如anotherclass.so,然后在主程序中使用此myclass.so库。请问我如何做到这一点。

c++ linux shared-libraries shared-objects c++11

1
推荐指数
2
解决办法
3290
查看次数

使用 std::string 调用 C++11 中的函数

我想使用字符串值来调用函数。这可能吗?有人可以展示一些实现吗?我会很感激。

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)

c++ linux windows c++11

0
推荐指数
1
解决办法
575
查看次数