Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么尝试在64位OS X上加载Java VM库时dlopen()失败? 我试图将java虚拟机库加载到C++程序中,这样我就可以使用JNI调用接口。在Linux上运行良好,但在Mac上无法运行。该测试程序演示了: #include <iostream> #include <dlfcn.h> int main() { if (const char *error = dlerror()) std::cout << "Flushed existing error: " << error << std::endl; dlopen( "/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib", RTLD_NOW); // or RTLD_LAZY, no difference. if (const char *error = dlerror()) std::cout << "ERR: " << error << std::endl; }_C++_C_Macos_Dlopen - Fatal编程技术网

为什么尝试在64位OS X上加载Java VM库时dlopen()失败? 我试图将java虚拟机库加载到C++程序中,这样我就可以使用JNI调用接口。在Linux上运行良好,但在Mac上无法运行。该测试程序演示了: #include <iostream> #include <dlfcn.h> int main() { if (const char *error = dlerror()) std::cout << "Flushed existing error: " << error << std::endl; dlopen( "/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib", RTLD_NOW); // or RTLD_LAZY, no difference. if (const char *error = dlerror()) std::cout << "ERR: " << error << std::endl; }

为什么尝试在64位OS X上加载Java VM库时dlopen()失败? 我试图将java虚拟机库加载到C++程序中,这样我就可以使用JNI调用接口。在Linux上运行良好,但在Mac上无法运行。该测试程序演示了: #include <iostream> #include <dlfcn.h> int main() { if (const char *error = dlerror()) std::cout << "Flushed existing error: " << error << std::endl; dlopen( "/System/Library/Frameworks/JavaVM.framework/Libraries/libjvm.dylib", RTLD_NOW); // or RTLD_LAZY, no difference. if (const char *error = dlerror()) std::cout << "ERR: " << error << std::endl; },c++,c,macos,dlopen,C++,C,Macos,Dlopen,我理解这个问题——libjvm.dylib不是一个胖文件,它只包含i386体系结构的目标代码,我运行在64位Mac和64位操作系统上。参考: 建议的解决方法是使用服务器JVM。但将libjvm.dylib更改为libserver.dylib会导致另一个我不理解的错误: ERR: dlsym(RTLD_DEFAULT, func__entry): symbol not found 我因调用dlopen而收到dlsym错误。奇怪的nm确认libserver.dylib中不存在符号: $ lipo

我理解这个问题——libjvm.dylib不是一个胖文件,它只包含i386体系结构的目标代码,我运行在64位Mac和64位操作系统上。参考:

建议的解决方法是使用服务器JVM。但将libjvm.dylib更改为libserver.dylib会导致另一个我不理解的错误:

ERR: dlsym(RTLD_DEFAULT, func__entry): symbol not found
我因调用dlopen而收到dlsym错误。奇怪的nm确认libserver.dylib中不存在符号:

$ lipo -info libjvm.dylib
Non-fat file: libjvm.dylib is architecture: i386
$ nm libjvm.dylib|grep func
0037b3c0 D _func__entry
         U _jvm__func__entry

$ lipo -info libserver.dylib
Architectures in the fat file: libserver.dylib are: i386 x86_64 
$ nm libserver.dylib|grep func
                 U _jvm__func__entry
我找不到有关此
func\u条目的任何文档,也不知道下一步要尝试什么

编辑 此测试在SnowLeopard(10.6.8)上进行,默认JDK/JRE由Apple提供。我读到苹果将停止提供Java软件包,如果你升级到Lion,它们实际上会被删除。我不清楚新的“官方”JDK/JRE来自何处,但我安装并更改了对该库的dlopen调用:

"/Library/Java/JavaVirtualMachines/1.7.0u-dev.jre/Contents/Home/lib/server/libjvm.dylib"

就我所知,服务器JVM是x64平台上唯一的JVM。您能显示加载服务器JVM时调用
dlsym
的代码吗?@BillyONeal,我在调用dlopen时收到dlsym错误。我发布的代码就是产生该错误的所有代码。我的猜测是,在内部,dlopen调用dlsym来获取某种类型的库静态构造函数/初始化例程func\uu entry,但它没有找到它。我希望它会给你同样的错误。另外,我应该注意,我不认为我专门安装了任何JDK,我只是有“库存”或Xcode安装的东西。据我所知,服务器JVM是x64平台上唯一的JVM。您能显示加载服务器JVM时调用
dlsym
的代码吗?@BillyONeal,我在调用dlopen时收到dlsym错误。我发布的代码就是产生该错误的所有代码。我的猜测是,在内部,dlopen调用dlsym来获取某种类型的库静态构造函数/初始化例程func\uu entry,但它没有找到它。我希望它会给你同样的错误。另外,我应该注意,我不认为我专门安装了任何JDK,我只是有“库存”或Xcode安装的东西。
"/Library/Java/JavaVirtualMachines/1.7.0u-dev.jre/Contents/Home/lib/server/libjvm.dylib"