繁体   English   中英

如何将共享库链接到另一个共享库

[英]How to link shared library to another shared library

我正在尝试创建实现JNI(Java本机接口)的共享库。 我的共享库正在使用另一个名为libPosAPI.so的共享库。 但是我的共享库无法正确链接libPosAPI.so共享功能。

在一个实现CPP,我想使用的功能vatps::PosAPI::sendData()libPosAPI.so 这是我的构建命令:

g++ -fPIC -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/linux" -I. -shared -o libPosAPIJni.so main_ubp_pos_PosAPIJni.cpp

它编译成功。 即使它不要求为libPosAPI.so提供链接器。 但是,当使用输出共享库( libPosAPIJni.so )时,它给出以下错误undefined symbol: _ZN5vatps6PosAPI8sendDataB5cxx11Ev 我还为libPosAPI.so提供了-L -l选项。 结果是一样的。

这是我的头文件。 那是javac -h PosAPIJni.java的结果。

main_ubp_pos_PosAPIJni.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class main_ubp_pos_PosAPIJni */

#ifndef _Included_main_ubp_pos_PosAPIJni
#define _Included_main_ubp_pos_PosAPIJni
#ifdef __cplusplus
extern "C" {
#endif

/*
 * Class:     main_ubp_pos_PosAPIJni
 * Method:    sendData
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_main_ubp_pos_PosAPIJni_sendData
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

main_ubp_pos_PosAPIJni.cpp

#include "main_ubp_pos_PosAPIJni.h"
#include "PosAPI.h" // header file of libPosAPI.so
#include <iostream>

using namespace std;

inline string jstring_to_string(JNIEnv* env, jstring string) {
    string value;
....
}

// IMPLEMENTATIONS
JNIEXPORT jstring JNICALL Java_main_ubp_pos_PosAPIJni_sendData(JNIEnv* env,
        jclass cls) {
    string res_sendData = vatps::PosAPI::sendData(); // The PROBLEM IS HERE!!. trying to use function of libPosAPI.so. declared in PosAPI.h

    return string_to_jstring(env, res_sendData);
}

两个共享库的nm命令的输出:

nm -D libPosAPI.so | grep sendData nm -D libPosAPI.so | grep sendData

000000000000c3e0 T sendData
000000000000a8dc T _ZN5vatps6PosAPI8sendDataEv

nm -u libPosAPIJni.so | grep sendData nm -u libPosAPIJni.so | grep sendData

U _ZN5vatps6PosAPI8sendDataB5cxx11Ev

请以正确的方式指导我:)

让我们对您的符号进行解码:

$ c++filt _ZN5vatps6PosAPI8sendDataB5cxx11Ev
vatps::PosAPI::sendData[abi:cxx11]()

所以,你的代码需要sendDatastd::string与C ++ 11 ABI,而libPosAPI.so提供sendData与预先C ++ 11 ABI std::string

abi:cxx11提示GCC5和C ++ 11 ABI

依赖于仍使用旧ABI的第三方库或插件接口的用户,可以使用-D_GLIBCXX_USE_CXX11_ABI=0构建其代码,并且一切正常。 在大多数情况下,由于链接器的错误抱怨涉及__cxx11未解析符号,因此何时需要此标志将很明显。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM