在 Linux 中从 C++ 库调用 C++ 函数

Posted

技术标签:

【中文标题】在 Linux 中从 C++ 库调用 C++ 函数【英文标题】:Call a C++ function from a C++ library in Linux 【发布时间】:2011-10-31 06:31:53 【问题描述】:

我想从 linux 上的 C++ 库中调用一个函数。我有那个库的共享对象。 我想调用从 ydmg 库返回 int 的方法 getAge()。

以下是我写的代码:

testydmg.cpp

#include "ydmg/bd.h"
#include "yut/hash.h"
#include "dlfcn.h"

extern "C" int getAge();

class testydmg
   public:
        testydmg::testydmg(const yutHash& user)

        
         testydmg::testydmg()

        

         testydmg::~testydmg()

        


        int testydmg::getFunction()
                void *handle;
                int (*voidfnc)();
                handle = dlopen("ydmg.so",RTLD_LAZY);
                if(handle == NULL)
                        printf("error in opening ydmg lib");
                 else 
                        voidfnc = (int (*)())dlsym(handle, "getAge");
                        (*voidfnc)();
                        printf("class loaded");
                
                ydmgBd obj;
                obj.getAge();
                printf("Inside getFunction()...");
                dlclose(handle);

        
;

我编译并链接代码如下:

gcc -fPIC -shared -l stdc++ -I/home/y/libexec64/jdk1.6.0/include -I/home/y/libexec64/jdk1.6.0/include/linux -I/home/y/include testydmg .cpp -o libTestYdmg.so libydmg.so

然后我检查新共享对象中的方法,即 libTestYdmg.so

nm -C libTestYdmg.so | egrep getAge 运行上面的命令我什么也没得到。

是不是表示它没有从库中获取方法getAge()。 你能纠正我哪里出错了吗?

【问题讨论】:

那里没有图书馆? getAge 仍然是一个未解析/延迟的符号。 【参考方案1】:

您想使用ydmgDB::getAge(),但您向图书馆请求getAge()。这是不正确的,只需创建一个ydmgDBobject 并调用它的方法getAge(),而不加载与您的编译命令行链接的库。

你不需要dlopen图书馆。

此外,getAge 并没有真正包含在libTestYdmg.so 中。您必须在libydmg.so 中使用:

nm -C libydmg.so | grep getAge

【讨论】:

【参考方案2】:

如果您对在 C++ 代码中实际使用 dlopen 感兴趣,请查看 C++ dlopen mini HOWTO,包括示例代码和一些可能重要的 警告。

【讨论】:

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

在 Android JNI/NDK 代码中从 C++ 函数调用 C 函数

在 WP8 中从 C++ 代码调用 C# 方法

是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?

linux c++ 怎么 调用自己函数的

C++ 调用 C++ 库函数但执行了错误的函数

在同一解决方案中从 c# 项目到 c++ 项目的 DllImport