是的,我其实想要得到那个错误。我正在使用MSVC(命令提示符)。我想要.lib,它需要定义与之链接的外部符号。我必须理解静态链接的错误,因为对我来说,我的方法似乎是合法的:
我有一个看起来大致如下的文件:
extern INFO_BLOCK user_setup;
int
crtInit()
{
SetInfoBlock(&user_setup);
return 0;
}
当我尝试在与主模块的编译中使用此文件的.obj时
cl main.c file.obj
它表示未解决的外部问题。这是理想的行为。
然而,一旦我将file.obj与lib file.obj
打包,即使使用/ include:user_data(在这种情况下坦率地说我不相信它是有用的)
将.lib与cl main.c /link file.lib
一起使用不会产生丢失的外部因素,这就是问题所在。我需要程序员来定义该符号。将.obj放入.lib后,extern会被删除吗?我哪里错了?
答案 0 :(得分:2)
如果main.c
不包含对crtInit
的任何引用,则链接器没有理由将该函数拉入生成的二进制文件中 - 因此它不会"参见"尚未解决的user_setup
引用。
当您向链接器提及目标文件时,强制它将目标文件包含到二进制文件中,无论程序是否需要它
与此相反,当您向链接器提及库时,它将仅使用该库来解析您在此时已经拥有的目标文件的未解析引用它从这个图书馆拉进来。如果到目前为止还没有解决任何问题(或者库中的任何符号都不满意),链接器根本不会使用库中的任何内容。
以上也是为什么许多链接器在链接时(通常从特定到通用 - 或者"用户"到"系统")对库的顺序有点挑剔的原因,因为接头通常是单通道,只会拉入他们所看到的#34;在链接过程中的这个特定点需要。