首页 > 解决方案 > 使用静态库混淆 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 包含/排除代码有关,但objdumpnm显示该函数包含在所有场景中!

$ nm libA.a
ondata.c:
0000000000000000 T onData

非常感谢帮助。

标签: cgccld

解决方案


推荐阅读