在另一个文件中链接/使用 .so 文件
Linking/using .so file in another
我有以下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"以获取有关如何标记/使用符号的信息
相关文章:
- 通过多个头文件使用常量变量
- 生成文件不对文件使用隐式规则
- 两个文件使用彼此的功能-如何解决
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- 对同一文件使用 .read 的次数是否有限制?
- 是否有正确的方法对生成文件中的对象文件使用模板命令?(C++)
- 如何在C++中为整个文本文件使用字符串流while循环逻辑
- 如何对继承的文件使用前向声明
- 获取对源文件中特定函数的所有调用并生成其他文件(使用 C、C++预处理器或脚本)
- 从文件(使用strtok()和strcpy())解开数据时进行分割故障
- 在 c++ 中对两个文件使用标头
- 当删除部分依赖列表时,GNU make 对每个对象文件使用相同的源文件
- 如何在文本文件中仅读取一行,该文本文件使用QT具有特定单词
- 我应该只对原始 cpp 文件使用 add_executable() 还是通过 add_library() 创建一个库
- 在 c++ 和 c# 中,对文件容器中包含的文件使用文件路径
- CMD窗口停止工作,文本文件使用fstream读取错误
- 如何在 C++_ 中通过不同目录中的文件使用该变量
- JPEG编码位图(BMP)图像从文件使用libjpeg / C++
- 创建 时出错.SO文件使用Cygwin
- 文件I/O使用C++同时打开两个文件