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

以下是我编写的代码:

睾丸

#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()。
您能纠正我要去的地方吗?

最佳答案

您想使用ydmgDB::getAge(),但您要向库索取getAge()。这是不正确的,仅创建一个ydmgDB对象并调用其方法getAge()而不加载与您的编译命令行链接的库即可。

您不需要dlopen库。

此外,getAge并未真正包含在libTestYdmg.so中。您必须使用以下命令在libydmg.so中查找它:

nm -C libydmg.so | grep getAge

10-08 11:57