我有一个静态库staticLibA.lib
,它提供了许多函数。其中一些需要一些此库中未提供的外部函数。
此外,我定义了一个动态库dynLib.dll
,它使用一些静态库函数,但没有任何需要提到的外部函数的函数。
但是,如果我链接动态库,我会得到未解析的外部符号,尽管事实上它们不是必需的。
编译器不应该只从目标确实需要的静态库中选择函数吗?
这里有一个小例子
staticLib.lib:
// staticLib_fileA.c
extern void extLibFunction();
void slib_funcA(){
extLibFunction();
// some stuff
}
// staticLib_fileB.c
void slib_funcB(){
// some stuff
}
dynLib.dll
// dynLib.c
void dyn_func(){
slib_funcB();
// some stuff
}
dynLib.dll
的编译/链接带来了未解析的符号extLibFunction
:
staticLib.lib(staticLib_fileA.obj) : error LNK2001: unresolved external symbol extLibFunction
有办法解决这个问题吗?一些编译器设置告诉您仅链接实际所需的符号。 解决方法是一些虚拟实现,但我更喜欢某种方式,只强制库的用户在需要这些部分时执行某些操作
最佳答案
与静态库不同,DLL 不能有未解析的符号(引用)。 DLL 允许二进制文件在运行时访问所有符号,即使其中一些符号是不需要的。 库由 .o 文件组成。库中的某些 .o 文件可能包含程序中未使用的符号。 在链接时,静态库可以包含未解析的符号,只要您不需要这些未解析的符号或包含未解析符号的 .o 文件中的任何其他符号。对于 DLL,情况就不一样了,您必须在链接时解析所有引用,即使您的程序不需要它们。
关于c++ - dll 链接静态库 - 来自未使用函数的未解析链接器符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57907639/