从C++调用共享库

9
我有一个包含一些函数的共享库。我想通过从另一个程序中调用该库来访问那些函数。我以前在C中做过这个。
现在我想使用C++完成相同的任务。我对C++很陌生,需要任何建议。顺便说一下,共享库是用C编写的。是否仍然可以在C++程序中调用它并使用其中的所有函数? 请帮帮我,一个示例程序会非常有帮助。
我正在使用Ubuntu 14.04,编译器是随其提供的原生g ++。

如果您[编辑]问题并包括一些更多的细节,例如开发环境(编译器、链接器等)和可能的操作系统,则可能可以通过按[标记]按钮请求mod将此问题转移到堆栈溢出。目前的写法让我怀疑由于缺乏细节,它很快就会在那里关闭。 - Dan Pichelman
肯定是特定于操作系统的。在Windows中执行此操作的方式与在Linux中执行的方式完全相同。 - Gort the Robot
@StevenBurnap 谢谢你提供链接,伙计。我问这个问题的想法是,有人肯定已经做过很多次并能够提供一个例子。 - chavalisurya
如何从共享库中调用一个函数? - Thomas
2个回答

9
使用 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


0

你说你已经用C语言做过了。实际上,C++是基于C的,所以你仍然可以用之前相同的方法来完成。

通常需要以下步骤:

  • 在你的C++代码中使用库提供的某种方法
  • 找出哪个头文件提供了该方法,并将其包含在你的.cpp文件中
  • 使用库的头文件编译你的C++代码(Makefile中的编译器标志)
  • 链接库(Makefile中的链接器标志)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接