C++ 本地动态库

C++ 本地动态库,c++,dynamic-library,C++,Dynamic Library,一开始,我想说我从未使用过动态库,所以我甚至可能不理解它们是如何正常工作的 我想让一个完全加载的代码运行,在一些可能的用户交互之后,我想加载一个特定的库并在该库中执行一个函数。最好以后把它关上。基本上允许我在运行时更改并重新加载它 这是名为dynlib.so的简单动态库,与主代码位于同一目录中: int getInt(int arg_0) { return (arg_0 + 7); } 这是主要的节目: #include <iostream> #include <dlfc

一开始,我想说我从未使用过动态库,所以我甚至可能不理解它们是如何正常工作的

我想让一个完全加载的代码运行,在一些可能的用户交互之后,我想加载一个特定的库并在该库中执行一个函数。最好以后把它关上。基本上允许我在运行时更改并重新加载它

这是名为dynlib.so的简单动态库,与主代码位于同一目录中:

int getInt(int arg_0)
{
  return (arg_0 + 7);
}
这是主要的节目:

#include <iostream>
#include <dlfcn.h>

int main() {
  void *lib_handle = dlopen("./dynlib.so", RTLD_LAZY | RTLD_NOW);
  if (!lib_handle) {
    fprintf(stderr, "%s\n", dlerror());
    exit(EXIT_FAILURE);
  }

  typedef int (*func_ptr)(int);
  func_ptr func = (func_ptr)dlsym(lib_handle, "getInt");
  std::cout << func(13);

  dlclose(lib_handle);
}
我正在使用:g++-std=c++11-ldl loadlibtest.cpp-o main编译它


我捕获的错误是./libshared.so:我的if中的文件太短!lib_handle{.

它对我来说很好用。我已经用

$ gcc dynlib.c -fPIC -shared -o dynlib.so

显然,您需要将其编译为C或C++与外部C以避免名称的篡改。 在g++调用中,我需要将-ldl放在源文件之后

gcc:4.8.5;g++:5.3.0

dlsym也可能失败,从void*到函数指针的强制转换在技术上是无效的。您应该根据修改后的函数:

       dlerror();    /* Clear any existing error */

       /* Writing: func = (int (*)(int)) dlsym(handle, "getInt");
          would seem more natural, but the C99 standard leaves
          casting from "void *" to a function pointer undefined.
          The assignment used below is the POSIX.1-2003 (Technical
          Corrigendum 1) workaround; see the Rationale for the
          POSIX specification of dlsym(). */

       *(void **) (&func) = dlsym(handle, "getInt");

       if ((error = dlerror()) != NULL)  {
           fprintf(stderr, "%s\n", error);
           exit(EXIT_FAILURE);
       }

这对我来说很好,我已经编译了dynlib.so

$ gcc dynlib.c -fPIC -shared -o dynlib.so

显然,您需要将其编译为C或C++与外部C以避免名称的篡改。 在g++调用中,我需要将-ldl放在源文件之后

gcc:4.8.5;g++:5.3.0

dlsym也可能失败,从void*到函数指针的强制转换在技术上是无效的。您应该根据修改后的函数:

       dlerror();    /* Clear any existing error */

       /* Writing: func = (int (*)(int)) dlsym(handle, "getInt");
          would seem more natural, but the C99 standard leaves
          casting from "void *" to a function pointer undefined.
          The assignment used below is the POSIX.1-2003 (Technical
          Corrigendum 1) workaround; see the Rationale for the
          POSIX specification of dlsym(). */

       *(void **) (&func) = dlsym(handle, "getInt");

       if ((error = dlerror()) != NULL)  {
           fprintf(stderr, "%s\n", error);
           exit(EXIT_FAILURE);
       }

在一些很好的回复之后,我发现我做错了什么

1我的库函数没有使用extern C,因此dlsym无法找到该函数


2我不知道动态库必须编译在一些很好的回复之后,我发现我做错了什么

1我的库函数没有使用extern C,因此dlsym无法找到该函数



2我不知道动态库必须编译显然,你的dynlib.so有问题。它是如何创建的?你试过nm-D dynlib.so吗?@SergeyA不确定你的意思,但我猜是手动的。@Jimmy我没有,尽管它返回nm:dynlib.so:文件格式不是recognized@areuz,手动方式如何?您的nm输出应该是一个强大的表明无论创建它的过程是什么,它都不是正确的。显然,您的dynlib.so有问题。它是如何创建的?您尝试过nm-D dynlib.so吗?@SergeyA不确定这是什么意思,但我猜是手动创建的。@Jimmy我没有,尽管它返回nm:dynlib.so:File format NOTrecognized@areuz,手动方式如何?您的nm输出t应该是一个强烈的迹象,表明无论创建它的过程是什么,它都不是正确的。我添加了外部链接,错误现在是。/dynlib.so:invalid ELF header.^^^^因此我也用g++-std=c++11-fPIC loadlibtest.cpp-ldl-o main编译了它。g++和gcc都是4.8.4。@areuz问题是,你是如何编译dynlib.so的?g++-fPIC-shared dynlib.cc-o dynlib.so where dynlib.cc是封装在extern C中的getInt定义,对我来说很好。在你最近的编辑中,你没有定义func,也没有定义error。但我希望错误是char。你的问题似乎是你正在创建dynlib。错得很厉害。你知道我说我对动态库一无所知。嗯,我以前没见过有人编译它。在我做了你说的之后,它工作得很好。我添加了外部链接,现在错误是。/dynlib.so:invalid ELF header.^^^我也用g++-std=c++11-fPIC loadlibtest.cpp-ldl-o main编译了它。g++和gcc都是4.8.4。@areuz问题是,你是如何编译dynlib.so?g的++-fPIC-shared dynlib.cc-o dynlib.so where dynlib.cc是封装在extern C中的getInt定义,对我来说很好。在你最近的编辑中,你没有定义func,也没有定义error。但是我希望error是char。你的问题似乎是你正在创建dynlib.so error。你知道我说我对动态库一无所知。我们LL,我以前没见过有人编译它。在我做了你说的之后,它就像一个魔法。有一种方法使用未编译的代码作为共享库。方法叫做编译。-C和C++不是为运行时解释而设计的语言。如果你是动态加载的,插件必须作为源提供,那么程序需要。首先,编译它自己。@ pSooCIK谢谢:我会研究它,它不难。有一种方法使用未编译的代码作为共享库。方法叫做编译。-C和C++不是为运行时解释而设计的语言。如果你是动态加载的,插件必须作为源提供,那么程序需要编译。首先是它自己。@PSkocik谢谢:我会调查的,不会那么难的。