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

2024-04-03

我正在尝试编译以下简单的 DL 库示例代码程序库-HOWTO http://tldp.org/HOWTO/Program-Library-HOWTO/dl-libraries.html与 g++。这只是一个示例,以便我可以学习如何使用和编写共享库。我正在开发的库的实际代码将用 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)' 的转换无效

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

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

完成此操作后,我收到以下错误:

foo.cpp:16: 错误:无法在赋值中将 'double*' 转换为 'double (*)(double)'

这些问题可能更多地与我自己对正确的 C++ 编码标准的无知有关。谁能给我指点一个关于使用 C++ 示例代码为 Linux 开发动态库的好教程?


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");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 g++ 进行动态共享库编译 的相关文章

随机推荐