我编写了一个代码,其中包含可执行文件和[lib * .so]库作为我的参数并链接@运行时。
我还要接受(* .o)文件@运行时的功能并将其链接。 但我不知道如何去做。
编辑1: 我想要链接的函数是lib * .so库中.o文件的一部分。 所以我想指定库名称以及同一个库@ Run-Time中的函数名称。
例如。如果我的库包含两个函数(即* .o文件),链接器应该编译我想要使用的函数@ Run-Time。
我已发布代码,请帮助:
#include <stdio.h>
#include <unistd.h>
#include <dlfcn.h> // use -ldl
typedef float (*DepFn)(short, short);
int main(int argc, char* argv[])
{
void* lib;
DepFn df;
if(argc < 2)
return printf("USAGE: %s lib-file\n", argv[0]);
lib = dlopen(argv[1], RTLD_NOW);
if(lib == NULL)
return printf("ERROR: Cannot load library\n");
df = dlsym(lib, "Depreciation");
if(df)
{
short l, i;
printf("Enter useful-life of asset: ");
scanf("%hd", &l);
for(i = 1; i <= l; i++)
{
float d = 100 * df(l, i);
printf("%hd\t%.1f%%\n", i, d);
}
}
else
printf("ERROR: Invalid library\n");
dlclose(lib);
}
答案 0 :(得分:1)
您无法使用标准函数在运行时加载可重定位的(*.o
)。您需要确保将对象编译为与位置无关的代码(例如-fPIC
),然后从中创建共享对象。像ld -shared -o foo.so foo.o
这样的东西可以解决问题。
答案 1 :(得分:1)
根据您的评论,您只想链接到您的共享库
将您的代码更改为:
extern float Depreciation(short i,k); //should rather go in a header file
int main(int argc, char* argv[])
{
short l, i;
printf("Enter useful-life of asset: ");
scanf("%hd", &l);
for(i = 1; i <= l; i++)
{
float d = 100 * Depreciation(l, i);
printf("%hd\t%.1f%%\n", i, d);
}
}
编译并链接到您的共享库:
gcc -o myprogram myprogram.c -lXX
您的libXX.so需要安装在例如/ usr / lib /用于以上工作 有关详细信息,请参阅here。
答案 2 :(得分:1)
如果你需要在运行时获取函数名,你需要在argv [2]中传递它,而不是在dlsym
使用argv [2]中硬编码函数名。
if(argc < 3)
return printf("USAGE: %s lib-file function-name\n", argv[0]);
lib = dlopen(argv[1], RTLD_NOW);
if(lib == NULL)
return printf("ERROR: Cannot load library\n");
df = dlsym(lib, argv[2]);