C++ 如何在C++;?

C++ 如何在C++;?,c++,load,shared-objects,C++,Load,Shared Objects,我有一个共享对象(相当于Windows dll的Linux)要导入并与测试代码一起使用 我肯定不是这么简单;)但这正是我想做的 #include "headerforClassFromBlah.h" int main() { load( "blah.so" ); ClassFromBlah a; a.DoSomething(); } 我认为这是一个非常基本的问题,但我在搜索网页时找不到任何跳出去的东西。这取决于平台。在运行时,在Linux上,您使用,在windows

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

我肯定不是这么简单;)但这正是我想做的

#include "headerforClassFromBlah.h"

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

    ClassFromBlah a;
    a.DoSomething();
}

我认为这是一个非常基本的问题,但我在搜索网页时找不到任何跳出去的东西。

这取决于平台。在运行时,在Linux上,您使用,在windows上,您使用

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

您需要包含与共享库关联的任何头文件,以获取诸如ClassFromBlah之类的内容。然后,您需要链接到。因此-具体如何执行此操作取决于编译器和一般安装,但对于g++而言,类似于:

g++ myfile.cpp -lblah

可能会起作用。

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

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

静态:

#include "blah.h"
int main()
{
  ClassFromBlah a;
  a.DoSomething();
}

gcc yourfile.cpp -lblah
动态(在Linux中):

#包括
#包括
#包括
int main(int argc,字符**argv){
无效*手柄;
双(*余弦)(双);
字符*错误;
handle=dlopen(“libm.so”,RTLD_-LAZY);
如果(!句柄){
fprintf(stderr,“%s\n”,dlerror());
出口(1);
}
dlerror();/*清除任何现有错误*/
余弦=dlsym(手柄,cos);
如果((error=dlerror())!=NULL){
fprintf(stderr,“%s\n”,错误);
出口(1);
}
printf(“%f\n”,(*余弦)(2.0));
dlclose(手柄);
返回0;
}
*偷自 windows或任何其他平台下的过程都是相同的,只需将dlopen替换为平台版本的动态符号搜索

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


关于何时使用静态链接和何时使用动态链接,有一些说法。

是-l链接了归档文件,如libblah.a,或者如果将-PIC添加到gcc,您将得到一个“共享对象”文件libblah.so(是链接器构建了它)。 我曾经有一个SUN,并且已经构建了这种类型的文件。
文件的修订号必须精确或更高(代码可能因错误而更改)。但是带有参数的调用必须与输出相同。

可能我很困惑,但您似乎没有足够的信息。例如,blah.so包含什么?你确定你说的不仅仅是使用引用?你说的“共享”到底是什么意思?呃…所以文件不是代码文件,对吗?也许你想从.so(共享库)文件中检索对象?我已经包含了标题,我可以编译并链接我的代码与共享对象,但我不知道如何使用它及其包含的类-我没有说清楚,请参阅我的代码段更新。有什么想法吗?至于如何使用它包含的类,恐怕你必须使用RTFM。@neil这可能是Ben需要的解决方案。。。dlopen接受的答案可能只是对初学者问题(Ben?)的误解@Ben L:如果你不知道里面有什么,那么你在使用dlsym时就会遇到问题;-)@KarlMorrison-l是加载共享库的标志。前面的“blah”是共享库的名称,在本例中,他/她使用了OP在其示例中使用的库的名称。@Anoyz如果C/C++可以重写以使其更有意义就好了。谢谢你的解释+1.也许值得一提的是,DLOPEN是POSIX,而不是C或C++。在一些平台上没有动态加载,但它们仍然符合C++实现。什么是构建这个文件的命令,G+++ FielnaM.CP-L-FAN是否包含-0文件工作?需要使用-LDL toOnToT链接DLSEM(句柄,“COS”)引用C函数,因此很容易找到名称。C++生成装饰,使这些代码不那么容易编写。(至少没有使用外部的“C”扩展,所以写一个C函数来获得C++函数。)“LBLAH”是什么,你能详细阐述吗?
#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;
}