在 Linux (eclipse) 中使用 C++ 库

Posted

技术标签:

【中文标题】在 Linux (eclipse) 中使用 C++ 库【英文标题】:Using C++ Library in Linux (eclipse) 【发布时间】:2009-06-05 14:47:50 【问题描述】:

我写了一个库并想测试它。我编写了以下程序,但我从 eclipse 中收到一条错误消息。

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>

int main(int argc, char **argv) 
    void *handle;
    double (*desk)(char*);
    char *error;

    handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
    if (!handle) 
        fputs (dlerror(), stderr);
        exit(1);
    

    desk= dlsym(handle, "Apply"); // ERROR: cannot convert from 'void *' to 'double*(*)(char*)' for argument 1
    if ((error = dlerror()) != NULL)  
        fputs(error, stderr);
        exit(1);
    

    dlclose(handle);

怎么了?

问候。

【问题讨论】:

如果这是 C++,为什么它看起来这么像 C? 【参考方案1】:

在 C++ 中,您需要以下内容:


typedef double (*func)(char*);
func desk = reinterpret_cast<func>( dlsym(handle, "Apply"));

【讨论】:

是的,html 吃掉了我的尖括号 :) 固定,thatnks。 现在我得到了这个例外:未定义的对'dlerror' ...'dlsqm' ...'dlclose'的引用你知道解决方案吗?斯帕西博! 我在下面说过,但我也会在这里添加:您是否在 dl 中进行链接?尝试在编译器命令行中添加“-ldl”。【参考方案2】:

您需要显式转换 dlsym() 的返回值,它返回一个 void* 并且desk 不是 void* 类型。像这样:

desk = (double (*)(char*))dlsym(handle, "some_function");

【讨论】:

呃,我没想到。我尽可能多地显式施法,我不喜欢隐式施法的隐藏乐趣。我将删除关于 C 与 C++ 的争论。 这可能在 C 编译器中编译,对吧? C++ 编译器将需要强制转换。还是我错了? (抱歉 -- 已删除评论,然后重新添加 -- 令人困惑) 在这种情况下,为函数指针添加 typedef 通常会很好,这样您就可以强制转换它,而不会让代码行看起来像一堆括号和星号。 现在我得到了这个例外:未定义的对'dlerror' ...'dlsqm' ...'dlclose'的引用你知道解决方案吗?【参考方案3】:

基本上,在将 dlsym 分配给桌面时,您需要对它的返回值应用强制转换。在this article 中,他们将 void* 返回到他们的函数指针。

看this article。

【讨论】:

以上是关于在 Linux (eclipse) 中使用 C++ 库的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse、Red Hat Linux 中运行 c++ 项目时出现问题

C++ - 将 C++ 代码从 Visual Studio 移植到 Linux Eclipse IDE 时出现问题

windows eclipse c++怎么交叉编译linux

使用 Eclipse 调试 C++ 库

使用 C++ 为科学 Linux 安装 Eclipse

为 Linux 程序和 C++ 生成文件和使用 eclipse