c - 由于 -allow-shlib-undefined 链接器开关而产生的符号查找错误是否有任何解决方案?
问题描述
我试图了解 gnu 链接器的“-allow-shlib-undefined”开关的用法。为此,我编写了 libfoo.so 和 libfunc.so。
//libfoo.h
void say_hello(void);
//libfoo.c
#include <stdio.h>
#include "libfoo.h"
#include "libfunc.h"
void say_hello(void)
{
printf("Hello\n");
say_goodbye();
}
//libfunc.h
void say_goodbye(void);
//libfunc.c
#include <stdio.h>
#include "libfunc.h"
void say_goodbye(void)
{
printf("Goodbye!\n");
}
我使用以下 gcc 命令编译 libfoo 和 libfunc:
gcc -c libfoo.c -o libfoo.o
gcc -shared -o libfoo.so libfoo.o
gcc -c libfunc.c -o libfunc.o
gcc -shared -o libfunc.so libfunc.o
然后我写了以下“主要”代码:
#include "libfoo.h"
int main(void) {
say_hello();
}
然后我尝试使用以下 gcc 命令编译此代码:
gcc -L<path-to-libs> main.c -o main -lfoo
如我所料,此命令发生错误。(因为我没有链接 libfunc.so)然后我使用以下 gcc 命令编译 main.c:
gcc -L<path-to-libs> -Wl,-allow-shlib-undefined main.c -o main -lfoo
使用此命令编译成功。但是当我运行 main 我得到以下错误:
Hello
./main: symbol lookup error: /home/sarslan/shlib-undefined/libfoo.so: undefined symbol: say_goodbye
有没有办法解决这个错误?
解决方案
有没有办法解决这个错误?
是的:该标志适用于您知道将在运行时提供缺少的功能但(无论出于何种原因)您无法在链接时提供其定义的情况。
为了让你的程序工作,你必须在运行时提供一个不同 libfoo.so
的;一个要么
- 不打电话
say_goodby()
,或 - 提供了自己的定义
say_goodby()
。
或者,您可以使用LD_PRELOAD=./libfunc.so
.
当心:使用LD_PRELOAD
有许多潜在的并发症,而且几乎从来都不是正确的解决方案。
PS您正在构建没有-fPIC
. 这在许多架构上都不起作用,并且在它确实起作用的系统上不是最理想的。
推荐阅读
- javascript - 运行赛普拉斯时无法从构造函数中检索对象
- amazon-web-services - 带有外部 rabbitmq 代理的 aws
- google-drive-api - 谷歌驱动器文件访问需要什么 client_secret.json 文件
- javascript - 无法访问对象函数内的对象键?
- java - 尝试在导致崩溃的空对象引用上调用虚拟方法
- html - 为什么我的网站突然打不开了?
- python - 将包含 unicode 数据的 bytearray 转换为 str
- javascript - 如何理解这个 JavaScript 函数的流程
- excel - 如何从单元格中的字符串中识别和删除单个字母?
- react-native - 我怎样才能随时待命?