c - 使用静态库混淆 gcc 外部符号链接器问题
问题描述
我有一个使用 CMake 构建的应用程序,其中包括两个静态库,称为 libA 和 libB。
静态 libA 定义了一个函数:
void onData(char *msg) __attribute__((used));
void onData(char *msg) {
printf("test: %s\n", msg);
}
静态库 B 有以下内容myfunc.c
:
extern void onData(char *msg);
void myfunc() {
onData("hello");
}
该函数myfunc
由主应用程序调用,我希望test: hello
在标准输出中看到。
实际上,该应用程序无法链接到:
libB.a(myfunc.c.o): In function `myfunc':
myfunc.c:10: undefined reference to `onData'
collect2: error: ld returned 1 exit status
我认为这与 libA 未能包含该onData
符号有关(因为它没有被 libA 使用),因此尝试使用 来解决这个问题__attribute__((used))
,但它似乎没有任何区别。
现在......如果我在另一个函数中添加一些代码(在 libA 中),例如:
extern void onData(char *msg);
int main() {
printf("Location of onData: %p", onData);
}
然后应用程序链接正常。所以这与 gcc 包含/排除代码有关,但objdump
并nm
显示该函数包含在所有场景中!
$ nm libA.a
ondata.c:
0000000000000000 T onData
非常感谢帮助。
解决方案
推荐阅读
- c# - 从客户那里获取总成本,然后清除列表框。列表框保留以前的数据
- python - python exec 命令不选择自定义范围的全局变量?
- c++ - 检查由括号、方括号和大括号组成的一组括号是否有效?
- bigdata - pubnub 是否存储了流式大数据?
- assembly - 在 ARM 中构建 is.palindrome 和斐波那契数列,将值加载和移动到寄存器中
- html - 如何分离文本和按钮以进行倾斜,或组合文本和按钮?
- javascript - 如何进行无限滚动,在Vue js中动态渲染列表(仅可见)
- django - 使用 Cloud Build 自动化 App Engine 部署失败并出现错误
- angular - 在错误处理方法中调用 Angular Material Snackbar 时未打开
- graphql - Shopify GraphQL 使用 fetch API,返回空 json,没有错误