草庐IT

ruby-on-rails - OSX 10.7.5 - Ruby on Rails LoadError : Could not open library 'sodium' : dlopen(sodium, 5)

输入rakedb:create后我得到:LoadError:Couldnotopenlibrary'sodium':dlopen(sodium,5):imagenotfound.Couldnotopenlibrary'libsodium.dylib':dlopen(libsodium.dylib,5):imagenotfound这里还有一些输出。/Users/Mao/.rvm/gems/ruby-2.0.0-p451/gems/ffi-1.9.3/lib/ffi/library.rb:133:in`blockinffi_lib'/Users/Mao/.rvm/gems/ruby-2.0

ruby-on-rails - LoadError : dlopen(digest/sha1. bundle):找不到符号:_rb_Digest_SHA1_Finish

Ruby最近停止在我兄弟的机器上工作。gem命令rails服务器rails控制台全部失败并出现以下错误:$irbirb(main):001:0>require'digest/sha1'LoadError:dlopen(~/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/x86_64-darwin12.2.0/digest/sha1.bundle,9):Symbolnotfound:_rb_Digest_SHA1_FinishReferencedfrom:~/.rbenv/versions/2.0.0-p0/lib/ruby/2.0.0/x86_64-da

c - 在windows C中加载dll进行跨平台设计

我写了一个为linux平台设计的C代码。现在,我想让它跨平台,以便在Windows中使用。在我的代码中,我dlopen一个so文件并利用其中的函数。下面是我的代码的样子。但是我才发现,在windows下,加载和使用动态库的方式有很大的不同。void*mydynlibmydynlib=dlopen("/libpath/dynlib.so",RTLD_LAZY);void(*dynfunc1)()=dlsym(mydynlib,"dynfunc1");void(*dynfunc2)(char*,char*,double)=dlsym(mydynlib,"dynfunc2");int(*dy

windows - 在链接到可执行文件的 Windows 上加载插件的最佳方式?

我正在使用dlopen在Linux上加载*.so插件,我想使用mingw将插件功能移植到Windows。有一个dlfcn-win32库添加了一个围绕nativeWindowsDLL功能的dlopenAPI,但这并没有规避Windows的native限制,即DLL不能在主要可执行文件IIUC中引用符号。一种替代方法是使用EDLLlibrary,它通过在加载对象时在共享对象中链接未解析的符号来模仿UNIX功能。也许我可以实现一个使用EDLL库的dlfcn包装器?另一种选择就是generateanimportlibraryfortheexecutable,并使用dlfcn-win32。这些备

c - 如何判断一个so文件是否已经加载?

我有两个共享库:a.so和b.so。a.so必须在b.so加载之前加载。而且,a.so可能会被其他模块加载,而不是由我加载。因此,我想在调用dlopen("b.so",...)之前确定a.so是否已经加载。在Windows下,我可以使用GetModuleHandle("a.dll")通过检查返回值来确定它。即如果返回值不为null则说明a.dll已加载;否则它还没有加载。Linux下有类似GetModuleHandle的函数吗? 最佳答案 您实际上可以使用dlopen使用RTLD_NOLOAD标志进行检查:Don'tloadthel

c - 使用 MinGW 防止在 C(而非 C++)中进行名称重整以进行动态符号搜索

我有一个C程序,我在其中通过函数名称“动态地”获取函数指针(即,我将函数名称作为字符串传递并获取指向该函数的指针)。我已经在Linux中使用dlopen和dlsym做到了这一点,我想它也可以在任何其他类Unix中使用dlfcn工作。.当我尝试使用MinGW将该程序移植到Windows时,问题就开始了。当我尝试使用“GetProcAddress(handle,symbol_name)”查找名称时,其中“symbol_name”是我的回调函数的名称,“handle”是“GetModuleHandle(NULL)”返回的当前可执行文件的句柄,我什么也没得到因为MinGW名称修改会在我的符号名

cygwin dlopen错误:无效或不完整的多键或宽字符

这是cygwin。我有一个共享库,其中包含其他一些共享库和一些静态库。当调用dlopen()时,返回了一个手柄,但是perror()以“无效或不完整的多键或宽字符”返回null显然,我的图书馆内部的某些内容正在失败。我该如何调试?有什么方法可以让Dlopen告诉我哪个包含的库或功能是错误的?看答案两个问题:你检查errno即使功能没有失败。的价值errno仅当先前的函数失败时才定义。你不应该使用errno,perror或者strerror什么时候dlopen失败。你应该使用dlerror.

c++ - 动态库和主程序中的静态类变量

这个问题在这里已经有了答案:MainProgramandSharedLibraryinitializessamestaticvariablein__static_initialization_and_destruction_0(1个回答)关闭4年前。我正在开发一个包含静态STL容器类的类“A”的项目。此类包含在我的主程序和.so文件中。该类使用默认的(隐含的,未声明的)构造函数/析构函数。主程序使用dlopen()加载.so文件,并在其析构函数中调用dlclose()。当glibc调用静态类成员变量的析构函数时,程序在main退出后崩溃。问题似乎是,当调用dlclose()时,会调用静

c++ - dlopen'ing 时是否运行静态初始化(和/或其他)代码?

当您dlopen()一个共享对象时,是否有一种机制可以让该DLL中的代码在不显式调用的情况下执行?具体来说,dlopen()的调用者可能不知道的全局变量/静态变量的C++静态初始化代码?我很确定答案应该是"is",但我不记得是什么机制使它发生,以及如何利用它来运行任意代码。 最佳答案 是的:dlopen遵循在加载时运行代码的ELF二进制格式机制。实际上有两种这样的机制:旧版本使用特殊的.init和.fini部分,其中包含用于dlopen和的函数指针数组dlclose调用。由于这些部分在运行时可能不存在,因此还有指向相应部分的DT_I

c++ - 如何通过 dlopen() 将插件链接到应用程序

我正在为应用程序编写插件。应用程序将使用dlopen()加载插件。该平台是FedoraLinux11。我有该应用程序的所有源代码。我已成功将我的代码添加到应用程序中,并且链接正常,因为整个应用程序是同时链接的。但是,最终我希望我的代码成为一个单独的插件。我在将代码构建为插件时遇到问题。我将其构建为共享(.so)库。我的代码自然会引用应用程序中的符号,因此我需要使用g++-L和-l指定插件链接到的库选项。但是,接受我的插件的应用程序是单个可执行文件,而不是一组.so库。我在这里遗漏了一些基本要点。如何链接我的插件?请注意,我仍在尝试构建我的插件——我还没有达到尝试使用dlopen()加载