在 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()
。这是不正确的,只需创建一个ydmgDB
object 并调用它的方法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 函数
是啥导致在单元测试(NUnit 或 MSTest)中从 C# 调用的 C++ 函数与在控制台应用程序中运行的相同代码产生不同的结果?