首页 >Java >找不到已编译的c++库函数

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

WBOY
WBOY转载
2024-02-08 23:57:19948浏览

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中文网其他相关文章!

声明:
本文转载于:stackoverflow.com。如有侵权,请联系admin@php.cn删除