我正在编译调用共享库的C源,并且只在构建机器上有库头,而不是.so文件(不同的cpu架构)。如何在运行时查找代码并加载/usr/lib/libx.so?
答案 0 :(得分:1)
从LD_LIBRARY_PATH的原始建议中修改。
假设您使用的是Linux系统,可以在执行开始之前通过LD_PRELOAD
环境变量加载共享库:
$ LD_PRELOAD="/usr/lib/libx.so" your_app
然而,与-Wl,--unresolved-symbols=ignore-in-object-files
的关联可能不是一个好习惯。我建议使用dlsym
从动态库加载任意符号。例如,
#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>
int main ()
{
void *handle;
void (*foo_fp) (void); // function signature from dynamic library
// Dynamically load libfoo.so, searching it from LD_LIBRARY_PATH
handle = dlopen ("libfoo.so", RTLD_LAZY);
// Load function 'foo' from libfoo.so
foo_fp = dlsym(handle, "foo");
// Calls 'foo' from libfoo.so
foo_fp();
return 0;
}
编译:
gcc -o main main.c -ldl
执行:
export LD_LIBRARY_PATH=<location of libfoo.so>
./main
答案 1 :(得分:1)
创建一个&#39;虚拟&#39;导出所需符号的libx.so文件。