在另一个文件中链接/使用 .so 文件

Linking/using .so file in another

本文关键字:文件 使用 so 另一个 链接      更新时间:2023-10-16

我有以下getmacip.cpp文件,其中包含以下截图代码

// ...code
#include "test.h"
// ...code   
Test obj;
obj.printDem();
// ...code

这是test.h文件

#ifndef TEST_H
#define TEST_H
class Test
{
    public:
        void printDem();  
};
#endif

这是test.cpp文件

#include <iostream>
using namespace std;
void printDem()
{
    cout << "deus.ex.machina." << endl;
}

我已经获得了文件Getmacip.cpp与Java一起工作,正如你所看到的,我正在尝试从getmacip.cpp文件中调用printDem()方法。 我首先编译 getmacip.cpp如下:

g++ -fPIC -o libgetmacip.so -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux getmacip.cpp -lc

但是,当我对test执行相同的操作时.cpp并运行程序时,我收到错误

/usr/lib/jvm/java-8-oracle/bin/java: symbol lookup error: /home/karl/workspace/sslarp/lib/libgetmacip.so: undefined symbol: _ZN4Test8printDemEv

我显然错误地链接了文件!

printDem()的定义不属于类 Test

#include <iostream>
#include "test.h"
using namespace std;
void Test::printDem() {
    cout << "deus.ex.machina." << endl;
}

此外,您还应该将方法定义link到共享库中,如下所示:

g++ -fPIC -o libgetmacip.so 
    -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux 
        detmacip.cpp test.cpp

我还应该提到原始 JNI 是一个纯 C 接口,即所有本机调用都对声明为 C 函数的函数执行(它们的实现可能使用 C++,请查看本教程。此外,还有SWIG项目,它有助于为C++automa{g,t}ally创建所需的包装器。

你可以在这里检查什么样的符号

$ 纳米 -D libgetmacip.so

将生成符号列表

如果必须解构C++名称,请使用 c++filt

$ nm -D libgetmacip.so | C++filt

检查"man nm"以获取有关如何标记/使用符号的信息