首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中加载共享对象?

如何在C++中加载共享对象?
EN

Stack Overflow用户
提问于 2009-07-17 08:50:47
回答 4查看 49.5K关注 0票数 29

我有一个共享对象(相当于Windows dll的Linux ),我想导入它并与我的测试代码一起使用。

我敢肯定这不是这么简单;)但这是我想做的事情。

代码语言:javascript
复制
#include "headerforClassFromBlah.h"

int main()
{
    load( "blah.so" );

    ClassFromBlah a;
    a.DoSomething();
}

我假设这是一个非常基本的问题,但我在网上搜索时找不到任何能跳出来的东西。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-07-17 09:06:34

在C++中加载共享对象有两种方法

对于这两种方法中的任何一种,您都需要要使用的对象的头文件。标头将包含要在代码中使用的类或对象的定义。

静态地:

代码语言:javascript
复制
#include "blah.h"
int main()
{
  ClassFromBlah a;
  a.DoSomething();
}

gcc yourfile.cpp -lblah

动态(在Linux中):

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(int argc, char **argv) {
    void *handle;
    double (*cosine)(double);
    char *error;
    handle = dlopen ("libm.so", RTLD_LAZY);
    if (!handle) {
        fprintf (stderr, "%s\n", dlerror());
        exit(1);
    }
    dlerror();    /* Clear any existing error */
    cosine = dlsym(handle, "cos");
    if ((error = dlerror()) != NULL)  {
        fprintf (stderr, "%s\n", error);
        exit(1);
    }
    printf ("%f\n", (*cosine)(2.0));
    dlclose(handle);
    return 0;
}

*从dlopen Linux man page窃取windows或任何其他平台下的过程是相同的,只需将dlopen替换为平台版本的动态符号搜索。

要使动态方法起作用,您要导入/导出的所有符号都必须具有外部C链接。

关于何时使用静态链接和何时使用动态链接,有一些单词Here

票数 48
EN

Stack Overflow用户

发布于 2009-07-17 08:56:27

这取决于平台。在运行时,在Linux上,你可以使用dlopen,在windows上,你可以使用LoadLibrary

要在编译时执行此操作,请在windows上使用dllexportdllimport导出函数名。在linux上,gcc导出所有公共符号,这样你就可以正常地链接到它并调用函数。在这两种情况下,通常都需要在头文件中包含符号的名称,然后使用#include,然后使用编译器的工具链接到库。

票数 7
EN

Stack Overflow用户

发布于 2009-07-17 08:57:33

你需要#include任何与共享库相关的头文件,才能得到像ClassFromBlah这样的东西的解密。然后,您需要链接到.so -具体如何做取决于您的编译器和一般安装,但对于g++,类似于:

代码语言:javascript
复制
g++ myfile.cpp -lblah

也许能行得通。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1142103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档