c++ - dll 链接静态库 - 来自未使用函数的未解析链接器符号

标签 c++ c visual-studio visual-c++ linker

我有一个静态库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/

相关文章:

c++ - 是否有像映射这样的 C++ 结构,但我得到的不是值的键,而是值的句柄?

visual-studio - 在 Visual Studio 2015 下安装 Platform Toolset v120

c# - ASP.Net弹性搜寻

c++ - 如何在一个 while 循环中获取多个条件?

c++ - OpenGL -- 如何在 OpenGL 4.5 中处理多个 image1D

c++ - 排序后插入链表

c - 给定的字符串是否可转换为整数

c - c中的静态变量

c - 指针和函数

javascript - ASP .NET 鼠标移动事件