目录
问题内容
解决方法
首页 Java 找不到已编译的c++库函数

找不到已编译的c++库函数

Feb 08, 2024 pm 11:57 PM
编译错误 lsp

php小编柚子在编写C++程序时,有时可能会遇到“找不到已编译的C++库函数”的问题。这个错误通常发生在链接阶段,意味着编译器无法找到所需的库函数。造成这个问题的原因可能有多种,比如库文件路径配置错误、库文件未正确安装等。为了解决这个问题,我们可以通过检查库文件路径、重新安装库文件以及更新编译器等方法来修复。在本文中,我们将详细介绍如何解决这个常见的编译错误。

问题内容

我有一个名为 libmylibrary.a 的文件和一个名为 mylibrary.h 的头文件 其中包含一个名为 myfunction() 的函数。我将它们与 cpp 文件 (helloworldjni.cpp) 结合起来,创建了一个名为 native.dll 的新库。但是,当我尝试使用 jni 在 java 中编译 native.dll 时,我无法找到 libmylibrary.a 和 mylibrary.h 中的函数。

mylibrary.h

// mylibrary.h
#ifndef mylibrary_h
#define mylibrary_h

#ifdef __cplusplus
extern "c" {
#endif

void myfunction();  // declare the function prototype

#ifdef __cplusplus
}
#endif

#endif // mylibrary_h
登录后复制

这些是我遵循的步骤

1.创建用于集成jni的java文件(helloworldjni.java)

public class helloworldjni {
    static {
        system.load("/home/centos/test5/native.dll");
    }
    public static void main(string[] args) {
        new helloworldjni().sayhello();
    }
  //native method with no body
  public native void sayhello();
}
登录后复制

2.使用此命令创建了 helloworldjni.h 文件

javac -h .  helloworldjni.java
登录后复制

3.将mylibrary.h文件和helloworldjni.h文件与我的cpp文件(helloworldjni.cpp)集成

#include<iostream>
#include<jni.h>
#include "mylibrary.h"
#include "helloworldjni.h"
void sayhello(){
  myfunction();
}
int main() {
    sayhello();  // call the function from the library

    return 0;
}
jniexport void jnicall java_helloworldjni_sayhello
  (jnienv* env, jobject thisobject) {
    sayhello();
}
登录后复制

4.编译这些文件(创建.o文件)

g++ helloworldjni.cpp -l. -lmylibrary -i"/home/centos/jdk-21.0.1/include" -i"/home/centos/jdk-21.0.1/include/linux" -o helloworldjni.o
登录后复制

5.生成.o文件到.dll文件

g++ -shared -o native.dll helloworldjni.o
登录后复制

6.编译并运行helloworldjni.java

java helloworldjni
登录后复制

收到此错误:

java: symbol lookup error: /home/centos/test5/native.dll: undefined symbol: myFunction
登录后复制

如何将 libmylibrary.a 合并到我的 java 代码编译中,以确保它能够识别 libmylibrary.a 中的函数?

ps:我确信 libmylibrary.a 没有问题,因为我能够使用纯 c++ 调用 myfunction() 但在使用 jni 时似乎存在某种我无法弄清楚的链接问题

解决方法

我尝试了您的所有步骤并进行了一些细微的更改,这对我有用。附加构建脚本:

#!/bin/sh

JAVA_SDK_HOME=/home/user/lib/jdk-21.0.1

#echo BUILD THE LIB
#g++ -c mylibrary.cpp -o mylibrary.o
#ar rcs libmylibrary.a mylibrary.o

echo MAKE JAVA STUB
$JAVA_SDK_HOME/bin/javac -h . HelloWorldJNI.java

echo BUILD SO file
g++ -c -fPIC -o HelloWorldJNI.o HelloWorldJNI.cpp \
  -I $JAVA_SDK_HOME/include/ \
  -I $JAVA_SDK_HOME/include/linux

g++ -shared -o native.dll HelloWorldJNI.o -L. -lmylibrary

echo TESTING
$JAVA_SDK_HOME/bin/java HelloWorldJNI


登录后复制

但有一些注意事项:

  1. 在 windows 上,您很可能必须设置一些宏,因此 jniexport 实际上是 __declspec(dllexport),而不是 __declspec(dllimport)
  2. 要在 linux 上链接 *.so 文件,您需要使用 -fpic 编译 c++ 文件

以上是找不到已编译的c++库函数的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

红米Note13RPro怎么调整字体大小? 红米Note13RPro怎么调整字体大小? May 07, 2024 pm 06:34 PM

不要改变原内容的意思,微调内容,重写内容,不要续写红米Note13RPro不仅性能出色,使用体验更加出色,为了让大家有更舒适的使用体验,红米Note13RPro配备了字体调整功能,让用户能够调整自己的手机的字体。如果你想知道红米Note13RPro怎么调整字体大小,那么就来看一看吧。红米Note13RPro怎么调整字体大小?1.打开“设置”应用程序。2.滚动到底部,选择“显示”。3.点击“文字大小”。4.在此屏幕上,您可以通过拖动滑块调整字体大小或者选择预设字体大小。5.调整完毕后,按“确定”保

红米Note13RPro怎么连接电脑? 红米Note13RPro怎么连接电脑? May 09, 2024 pm 06:52 PM

RedmiNote13RPro这款手机最近是非常火爆的,很多消费者都购买了这款手机,不过很多用户是第一次使用这款手机所以不清楚红米Note13RPro怎么连接电脑,对此,小编在这里为大家带来了详细的教程介绍。红米Note13RPro怎么连接电脑?1.使用USB数据线将红米手机连接到电脑的USB接口上。2.打开手机设置,击选项,将USB调试打开。3.在电脑上打开设备管理器,找到移动设备选项。4.右键点击移动设备,选择更新驱动程序,然后选择自动搜索更新的驱动程序。5.如果电脑没有自动搜索到驱动程序,

红米Note13RPro怎么提取图中的文字? 红米Note13RPro怎么提取图中的文字? May 08, 2024 pm 10:00 PM

红米Note13RPro手机在软件功能上集成了多项智能工具,其中,从图片中快速准确地提取文字内容便是其中之一,下面小编将为大家介绍红米Note13RPro如何提取图片中的文字。红米Note13RPro怎么提取图中的文字?使用小米扫码功能,打开手机的扫码应用,点击图片图标,选择一张图片,然后点击右边的“识别文字”选项,成功提取出图片中的文字。通过手机相册操作。在手机相册中找到需要提取文字的图片,点击图片下方的“更多”,选择“提取文字”,识别成功后,可以根据需要复制或保存文本。利用微信小程序。打开微

《整个活吧》全关卡通关攻略大全 《整个活吧》全关卡通关攻略大全 May 07, 2024 pm 06:31 PM

整个活吧是一款非常好玩的休闲解谜小游戏,大家可以在多平台体验!游戏提供了无数精彩的关卡等待解锁,每个关卡都充满了新奇和挑战,让你体验回答问题的有趣冒险,开启全新的游戏内容。那么整个活吧全关卡怎么通关呢?今天给大家带来了《整个活吧》全关卡通关攻略大全分享,大家过关遇到问题可以来参考一下哦!《整个活吧》全关卡通关攻略大全《整个活吧》全关卡通关攻略大全帮她守岁人鬼情未了帮小姐姐识别渣男狼外婆帮小女孩脱离危险户外探险假装看不见阿飘变回人形帮猩猩修成人形后座有人保持镇定和女鬼周旋夜班出租车保持镇定和女鬼周

《整个活吧》西游美人帮西游女角色归位通关攻略 《整个活吧》西游美人帮西游女角色归位通关攻略 May 07, 2024 pm 03:46 PM

整个活吧是抖音上非常火爆的趣味闯关小游戏,游戏中有超多的关卡等大家挑战!游戏中关卡西游美人这一关中大家需要帮西游女角色归位,具体怎么过关呢?下面是小编给大家带来的《整个活吧》西游美人帮西游女角色归位通关攻略,不清楚如何过关的小伙伴们一起来看看吧,希望能帮到大家。《整个活吧》西游美人帮西游女角色归位通关攻略西游美人帮西游女角色归位1、点击卷轴出现女角色2、白骨精、孔雀精需要点击切换动作3、答案如下图所示:《整个活吧》全关卡通关攻略大全帮她守岁人鬼情未了帮小姐姐识别渣男狼外婆帮小女孩脱离危险户外探险

《整个活吧》拯救邻居劝所有邻居下楼通关攻略 《整个活吧》拯救邻居劝所有邻居下楼通关攻略 May 07, 2024 pm 07:00 PM

整个活吧是抖音上非常火爆的趣味闯关小游戏,游戏中有超多的关卡等大家挑战!游戏中关卡拯救邻居这一关需要劝所有邻居下楼,具体怎么过关呢?下面是小编给大家带来的《整个活吧》拯救邻居劝所有邻居下楼通关攻略,不清楚如何过关的小伙伴们一起来看看吧,希望能帮到大家。《整个活吧》拯救邻居劝所有邻居下楼通关攻略拯救邻居劝所有邻居下楼1、楼下有人需要急救2、楼下书店在卖绝版学习资料3、楼下垃圾桶好多纸箱子4、我答应约会,你先下楼5、你家哥哥来咱们小区做推广了6、有人发现了新的钓鱼点7、拖动猫罐头到楼下8、拖动叉子给

VESA 宣布 DisplayHDR 1.2 规范,提高性能要求:增加色彩准确度、宽色域等 VESA 宣布 DisplayHDR 1.2 规范,提高性能要求:增加色彩准确度、宽色域等 May 08, 2024 pm 02:13 PM

本站5月8日消息,视频电子标准协会(VESA)今天发布新闻稿,宣布DisplayHDR1.2规范,并表示目前全球有超过3000款显示器型号通过DisplayHDR标准认证。DisplayHDR1.2版本规范带来了更严格的性能要求,对亮度、色域和位深度之外,还引入色彩精度、对比度、黑电平(blacklevel,指在经过一定校准的显示装置上,没有一行光亮输出的视频信号电平)和字幕闪烁的多项新测试要求。DisplayHDRv1.2改进了白色亮度级别测试,将黑色背景上的10%中心色块测试更改为非黑色背景

红米Note13RPro怎么添加小组件? 红米Note13RPro怎么添加小组件? May 07, 2024 pm 07:55 PM

红米最近刚刚推出的RedmiNote13RPro就非常火爆,刚刚上市就拥有很不错的销量,不少消费者都入手了这款手机,为了让大家更好的使用红米Note13RPro,小编在这里为大家带来了红米Note13RPro添加小组件的方法介绍。红米Note13RPro怎么添加小组件?1、点击添加小部件长按桌面后点击添加小部件的选项。2、点击组件名称选择需要添加到小组件名称。3、点击添加到桌面选择下方的添加到桌面选项。4、点击确定选择右上角的确定图标即可。常见问题连接蓝牙换输入法主题更换出厂设置隐藏应用投屏电视