是的,我真的想得到那个错误。我正在使用 MSVC(命令提示符)。我想要 .lib 需要定义链接到它的外部符号。我必须理解有关静态链接的错误,因为对我来说我的方法似乎是合法的:
我有一个大致如下所示的文件:
extern INFO_BLOCK user_setup;
int
crtInit()
{
SetInfoBlock(&user_setup);
return 0;
}
当我尝试在编译主模块时使用此文件的 .obj
cl main.c file.obj
它表示 Unresolved external 问题。这是期望的行为。
尽管如此,一旦我用 lib file.obj
打包 file.obj 甚至使用/include:user_data (坦率地说,我不相信在这种情况下有任何用处)
将 .lib 与 cl main.c/link file.lib
一起使用不会生成丢失的外部组件,这就是问题所在。我需要程序员来定义那个符号。将 .obj 放入 .lib 后,extern 会被剥离吗?我哪里错了?
最佳答案
如果 main.c
不包含对 crtInit
的任何引用,则链接器没有理由将该函数拉入生成的二进制文件 - 因此它不会“看到"根本没有解决对 user_setup
的引用。
当您向链接器提及目标文件时,您强制它将该目标文件包含到二进制文件中,无论程序是否需要它.
与此相反,当您向链接器提及一个库时,它只会使用该库来解析未解析的引用您此时已经有了目标文件它从这个库中提取。如果到目前为止没有任何 Unresolved 问题(或库中的任何符号都不满足),链接器将根本不使用库中的任何内容。
以上也是为什么许多链接器在链接时对库的顺序有点挑剔的原因(通常是从特定到通用 - 或者“用户”到“系统”),因为链接器通常是单 channel 的,只会拉在链接过程的这个特定点上,他们“看到”需要什么。
关于c - 如何在 lib 错误中获取未解析的外部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39435256/