使用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);
}

如果我用gcc编译程序,则可以正常工作。

gcc -o foo foo.c -ldl

当我将文件名和编译器更改为以下内容时

g++ -o foo foo.cpp -ldl

我收到以下错误:

foo.cpp:16:错误:从'void *'到'double(*)(double)'的无效转换

我理解(我我理解,如果这是错误的,请纠正我)我无法从C ++中的void指针进行隐式强制转换,但是C允许我这样做,这就是为什么上面的代码将使用gcc而不是使用gcc进行编译的原因g ++。因此,我尝试通过将上面的第16行更改为显式转换:

cosine = (double *)dlsym(handle, "cos");

有了这个,我得到以下错误:

foo.cpp:16:错误:分配中无法将'double *'转换为'double(*)(double)'

这些问题可能与我自己对适当的C ++编码标准的普遍无知有关,而不是其他任何问题。谁能指出我关于使用C ++示例代码为Linux开发动态库的优秀教程?

准将Jaeger:

C允许从隐式强制转换void *为任何指针类型(包括函数指针);C ++需要显式转换。正如leiflundgren所说,您需要将返回值转换dlsym()为所需的函数指针类型。

许多人发现C的函数指针语法很尴尬。一种常见的模式是typedef函数指针:

typedef double (*cosine_func_ptr)(double);

您可以将函数指针变量定义cosine为类型的成员:

cosine_func_ptr cosine;

并使用类型而不是笨拙的函数指针语法进行强制转换:

cosine = (cosine_func_ptr)dlsym(handle, "cos");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章