【发布时间】:2016-01-09 05:41:23
【问题描述】:
您好,我对共享库有一些疑问。我在下面的共享库上在线教程是代码。请帮助我理解,非常感谢。
ctest1.c
void ctest1(int *i)
{
printf("I am in shared library");
*i=100;
}
ctest1.h
#ifndef CTEST_H
#define CTEST_H
#ifdef __cplusplus
extern "C" {
#endif
void ctest1(int *);
#ifdef __cplusplus
}
#endif
#endif
mytry.c
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include "ctest1.h"
int main(int argc, char **argv)
{
void *lib_handle;
double (*fn)(int *);
int x=990;
char *error;
lib_handle = dlopen("libmylibrary.so", RTLD_LAZY); // opening the shared library
if (!lib_handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(1);
}
fn = dlsym(lib_handle, "ctest1"); //storing the address of shared library function
if ((error = dlerror()) != NULL)
{
fprintf(stderr, "%s\n", error);
exit(1);
}
fn(&x);
printf("Valx=%d\n",x);
dlclose(lib_handle);
return 0;
}
第 1 步:使用 -c 选项创建一个目标文件 gcc -c 我的 ctest1.c
第 2 步:使用 -shared 选项创建共享库 gcc -shared -libmylibrary.so ctest1.c
第 3 步:编译我的主要源代码,即 mytry.c gcc -rdynamic -o run mytry.c -ldl
第 4 步: ./run
上面的代码一切顺利,但我有一些疑问,请帮助我理解。下面是列表。
为什么函数指针,即 fn 返回类型是双精度的,虽然它保存的是 dlsym 返回的地址,即 void *?
-
如果我使用以下命令在 c++ 中尝试相同的代码
g++ -rdynamic -o run mytry.cc -ldl
为什么我会收到错误,因为 从 void * 到 double() (int) 的转换无效我该如何解决?
fn = dlsym(lib_handle, "ctest1"); //存储共享库函数的地址这是我在c++中尝试时出错的地方
【问题讨论】:
-
哪一行产生了错误?
-
fn = dlsym(lib_handle, "ctest1"); //存储共享库函数的地址。如果我在 cpp 中尝试,这是 mytry.c 中的行
标签: c++ c shared-libraries