从 C++ 调用共享库

Posted

技术标签:

【中文标题】从 C++ 调用共享库【英文标题】:Calling a shared library from c++ 【发布时间】:2016-04-26 17:06:24 【问题描述】:

我有一个共享库,其中存储了一些函数。我想通过从另一个程序调用该库来访问这些函数。我之前在 C 中已经这样做了。

现在我想用 C++ 做同样的事情。我对 C++ 很陌生,非常需要任何建议。顺便说一句,共享库是用 C 编写的。我是否仍然可以在 C++ 程序中调用它并使用它的所有功能。 请帮我。一个示例程序会非常有帮助。

我使用的是 ubuntu 14.04,编译器是自带的原生 g++。

【问题讨论】:

如果您edit 您的问题包含更多详细信息,例如哪个开发环境(编译器、链接器等)以及可能的操作系统,那么它可能询问模组(通过按下 [flag] 按钮)将此问题转移到堆栈溢出。正如目前所写的那样,由于缺乏细节,我怀疑它会很快关闭。 绝对是操作系统特定的。在 Windows 中执行此操作的方式与在 Linux 中执行此操作的方式完全一样。 google.com/… @StevenBurnap 感谢链接人。我提出这个问题的想法是,有人已经这样做了很多次并且可以提供一个例子。 How to call a function from a shared library? 【参考方案1】:

使用dlopen 加载共享库,并使用dlsym 加载给定符号。链接-ldl

所以给定一个共享库hello.cpp,编译g++ -shared -fPIC -o libhello.so hello.cpp

#include <cstdio>

extern "C" void hello( const char* text ) 
  printf("Hello, %s\n", text);

(共享库应命名为lib*.so[.*]

现在调用main.cpp,编译:g++ -o main main.cpp -ldl

#include <dlfcn.h>

extern "C" typedef void (*hello_t)( const char* text );

int main() 
  void* lib = dlopen("./libhello.so", RTLD_LAZY);
  hello_t hello = (hello_t)dlsym( lib, "hello" );

  hello("World!");

  dlclose(lib);

见C++ dlopen mini HOWTO。

【讨论】:

【参考方案2】:

你说你已经在 C 中这样做了。实际上 C++ 是基于 C 的,所以你仍然可以像以前那样做。

通常需要以下步骤:

在您的 c++ 代码中使用库提供的一些方法 找出提供该方法的标头,并将其包含在您的 .cpp 文件中 根据库的头文件(Makefile 中的编译器标志)编译 C++ 代码 链接到库(Makefile 中的链接器标志)

【讨论】:

以上是关于从 C++ 调用共享库的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 中的共享库调用指向列表的静态指针

C++:动态共享库中的虚函数产生段错误

C 库的 C++ 包装器作为共享库

在通过网络文件系统共享的 HOME 下安装 C C++ 库

从堆栈跟踪中查找共享库中的源代码行

如何将 #defines 从 C++ 共享库导出到应用程序