gpt4 book ai didi

c++ - 使用 g++ 编译动态共享库

转载 作者:IT老高 更新时间:2023-10-28 23:09:15 28 4
gpt4 key购买 nike

我正在尝试从 Program-Library-HOWTO 编译以下简单的 DL 库示例代码与 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: error: invalid conversion from 'void*' to 'double (*)(double)'

我理解(我认为我理解,如果有错请纠正我)我不能从 C++ 中的 void 指针进行隐式转换,但 C 允许我这样做,这就是为什么上面的代码将使用 gcc 但不使用 g++ 编译。所以我通过将上面的第 16 行更改为:

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

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

foo.cpp:16: error: cannot convert 'double*' to 'double (*)(double)' in assignment

这些问题可能更多地与我自己对适当的 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");

关于c++ - 使用 g++ 编译动态共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/483797/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com