我有一个共享对象(相当于Windows dll的Linux ),我想导入它并与我的测试代码一起使用。
我敢肯定这不是这么简单;)但这是我想做的事情。
#include "headerforClassFromBlah.h"
int main()
{
load( "blah.so" );
ClassFromBlah a;
a.DoSomething();
}
我假设这是一个非常基本的问题,但我在网上搜索时找不到任何能跳出来的东西。
发布于 2009-07-17 09:06:34
在C++中加载共享对象有两种方法
对于这两种方法中的任何一种,您都需要要使用的对象的头文件。标头将包含要在代码中使用的类或对象的定义。
静态地:
#include "blah.h"
int main()
{
ClassFromBlah a;
a.DoSomething();
}
gcc yourfile.cpp -lblah
动态(在Linux中):
#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。
发布于 2009-07-17 08:56:27
这取决于平台。在运行时,在Linux上,你可以使用dlopen,在windows上,你可以使用LoadLibrary。
要在编译时执行此操作,请在windows上使用dllexport和dllimport导出函数名。在linux上,gcc导出所有公共符号,这样你就可以正常地链接到它并调用函数。在这两种情况下,通常都需要在头文件中包含符号的名称,然后使用#include
,然后使用编译器的工具链接到库。
发布于 2009-07-17 08:57:33
你需要#include任何与共享库相关的头文件,才能得到像ClassFromBlah这样的东西的解密。然后,您需要链接到.so -具体如何做取决于您的编译器和一般安装,但对于g++,类似于:
g++ myfile.cpp -lblah
也许能行得通。
https://stackoverflow.com/questions/1142103
复制相似问题