- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试创建一个共享库 libddv3djava.so
我像这样编译 libddv3djava.so 的源代码:
~/Programming/intellijprojects/ddv3dbindingstest/src $ g++ -c -Wall -Werror -I. -I /usr/lib/jvm/java-8-oracle/include/ -I /usr/lib/jvm/java-8-oracle/include/linux/ -fpic com_ddv3d_Ddv3dBinding.cpp
创建 libddv3djava.so:
~/Programming/intellijprojects/ddv3dbindingstest/src $ g++ -shared -o libddv3djava.so com_ddv3d_Ddv3dBinding.o
当我在 libddv3djava.so 上执行 ldd 时:
~/Programming/intellijprojects/ddv3dbindingstest/src $ ldd libddv3djava.so statically linked
它说 libddv3djava.so 是静态链接。我用 -shared 创建了 libddv3djava.so,所以这让我很困惑。
当 libddv3djava.so 不是静态链接时,为什么 ldd 输出静态链接?
我不确定以下内容是否相关,但可能相关; libddv3djava.so 依赖于我创建的另一个名为 libddv3d.so 的共享库。基本上 libddv3djava.so 是一个围绕 libddv3d.so 的 JNI 包装器。发帖来源:
com_ddv3d_Ddv3dBinding.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ddv3d_Ddv3dBinding */
#ifndef _Included_com_ddv3d_Ddv3dBinding
#define _Included_com_ddv3d_Ddv3dBinding
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ddv3d_Ddv3dBinding
* Method: initialize
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_initialize
(JNIEnv *, jobject);
/*
* Class: com_ddv3d_Ddv3dBinding
* Method: sendDrawableData
* Signature: (FFFFFFFI)V
*/
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_sendDrawableData
(JNIEnv *, jobject, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jfloat, jint);
/*
* Class: com_ddv3d_Ddv3dBinding
* Method: finished
* Signature: ()Z
*/
JNIEXPORT jboolean JNICALL Java_com_ddv3d_Ddv3dBinding_finished
(JNIEnv *, jobject);
/*
* Class: com_ddv3d_Ddv3dBinding
* Method: cleanup
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_cleanup
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
com_ddv3d_Ddv3dBinding.cpp:
#include <jni.h>
#include <ddv3d.h>
#include "com_ddv3d_Ddv3dBinding.h"
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_initialize(JNIEnv *env, jobject thisObj)
{
ddv3d::initialize();
return;
}
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_sendDrawableData(JNIEnv *env, jobject thisObj,
jfloat positionX, jfloat positionY, jfloat positionZ,
jfloat angle,
jfloat rotationAxisX, jfloat rotationAxisY, jfloat rotationAxisZ,
jint type)
{
ddv3d::sendDrawableData(positionX, positionY, positionZ,
angle,
rotationAxisX, rotationAxisY, rotationAxisZ,
type);
return;
}
JNIEXPORT jboolean JNICALL Java_com_ddv3d_Ddv3dBinding_finished(JNIEnv *env, jobject thisObj)
{
return ddv3d::finished();
}
JNIEXPORT void JNICALL Java_com_ddv3d_Ddv3dBinding_cleanup(JNIEnv *env, jobject thisObj)
{
ddv3d::cleanup();
return;
}
最佳答案
ldd 显示库或可执行文件需要哪些共享库。在这种情况下没有,因为 libddv3djava.so 是静态链接的。
编译器标志 -fpic 和链接器标志 -shared 使 libddv3djava.so 可以用作共享对象,这是其他东西。
要使 libddv3djava.so 依赖于共享库文件 libddv3d.so,必须将其添加到链接器命令中。
g++ -shared -o libddv3djava.so -lddvd3d com_ddv3d_Ddv3dBinding.o
如果找不到 libddv3d.so,您可以使用 -L 标志添加额外的路径进行搜索。
关于c++ - ldd 输出静态链接到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24491381/
当路径不存在时运行 ldd 命令时,我得到的是“找不到文件”而不是路径。bash-3.2$ ldd curl libcurl.so.4 =>/usr/local/lib/libcurl.so.4 li
假设我有一个 A.so 文件,它的依赖项是从 ldd 中找到的 #ldd A [...] libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007faaf972
我在可执行文件上运行 truss 命令并得到以下输出: stat64("/net/xyzmachine/vol/tools/solx64/studio11/SUNWspro/lib/rw7/librt
我在使用库时遇到问题,尽管它的版本正确,但找不到它。 ldd /lib/libQt5Core.so linux-gate.so.1 (0xb77ac000) libpt
我正在尝试创建一个共享库 libddv3djava.so 我像这样编译 libddv3djava.so 的源代码: ~/Programming/intellijprojects/ddv3dbindin
我知道 ldd 只能将二进制作为其参数我在这里问的是如何使用二进制运行 ldd,比如 mybin,带有二进制参数。例如,mybin --myparam ./configfile.conf。 如果我为我
我不清楚为什么 ldd 在找不到依赖项时多次向我显示同一个共享库。在一个使用 boost 的小可执行文件中,输出是: libboost_chrono.so.1.49.0 => not found li
我在 Open MPI 创建的可执行文件上运行了 ldd 命令。它显示了对 libpthread.so 的引用使用 LD_PRELOAD 变量,我创建了自己的 pthread_create 实现,但从
假设我们有一个名为 utils.so 的共享库。它可能包含 undefined symbol 。还假设 ldd 报告该库依赖于其他一些库: $ ldd utils.so library1.so
我正在 Linux (Ubuntu 11) 下编译 2 个共享库(“A”、“B”) 库“B”正在使用库“A”的导出函数(与 -lA 静态链接) 但是当我在“B”上运行 ldd 时,我只有* linux
我正在尝试编译项目。它编译成功。我的make命令退出,状态代码为 0并且没有显示错误。 但是,该项目无法运行,当我运行 ldd -d 时它显示我有两个库未找到。 >ldd -d output_fil
为什么给ldd可执行文件名时没有出现动态加载的库?这是真的吗?因为我给的时候找不到。这可能是因为动态加载和动态链接。 请帮我解决这个问题,如果您需要任何进一步的详细信息,请告诉我。 输出如下。 ldd
如果问题很基础,请直截了当。 ldd 命令显示可执行文件上的依赖库是我所知道的。在可执行文件中,这些信息保存在哪里? 最佳答案 这存储在 ELF 的 .dynamic 部分中可执行。参见 ELF-64
我有一个二进制文件,其中 ldd 显示出意外的依赖关系和 libicuuc(来自“icu”)。 #ldd A [...] libxml2.so.2 => /usr/lib64/libxml2.so.2
我有一个使用一堆 .so 文件的二进制文件。 bash-3.00$ file foo foo: ELF 32-bit LSB executable, Intel 80386, version 1 (S
ldd如何知道这取决于 libc.so.6 ,不是 libc.so.5或 libc.so.7 ? libc.so.6 => /lib64/libc.so.6 (0x00000034f4000000)
Version information: ./VideoEncoderFilter.so: libgcc_s.so.1 (GCC_3.0) => /lib/x86_64-linux-gnu/l
我试图为 Linux 部署 Qt/QML 应用程序。发生了一些奇怪的事情,目标系统提示 libQt5Widget.so.5 中 undefined symbol ,而我已经复制了 ldd -r 结果中
如何从可执行文件的 ldd 输出中复制所有共享对象? 我正在寻找这样的东西,但这是用于 find 的,我需要 ldd: find -name "*python3.7*" -exec cp "{}" /
由于使用 Gentoo,更新程序后经常会链接到旧版本的库。通常,revdep-rebuild 有助于解决这个问题,但这次它是对 python 库的依赖,而 python-updater 不会选择它。
我是一名优秀的程序员,十分优秀!