DLL 链接静态库 - 未使用函数中未解析的链接器符号
dll linking static library - unresolved linker symbols from unused functions
我有一个静态库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
}
丁利布.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,事情是不一样的,你必须在链接时解析所有引用,即使你的程序不需要它们。
似乎整个目标文件彼此依赖,因为fileB.obj
中的其他功能导致fileA.obj
依赖。
正因为如此,还必须填充外部依赖项,即使使用此依赖项的函数永远不会在链接的二进制文件中被调用(或者在 dll 的情况下:被导出(,甚至不会在fileB
中被调用。
如果启用了"功能级链接"和"Comdat Folding",这似乎是正确的。
为什么这是真的,Raymond Chen在一系列围绕链接原理的博客文章中进行了解释:
https://devblogs.microsoft.com/oldnewthing/tag/linker
事实证明,即使使用高级技术(如上面提到的(,第一步也是必须解决其所有符号的经典方法,即使之后的优化将再次剥离这些符号。
- 使用gcc从静态链接的文件中查找可选符号
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- Windows 链接器是否使用 LoadLibrary 解析 DLL 中未定义的符号?
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- emscripten 链接全局命名符号乘法定义
- 体系结构x86_64的未定义符号:链接器错误
- 共享对象、符号、C/C++ 库链接和加载
- 如何防止 CMake 在构建时(而不是在安装时)为共享库创建符号链接?
- 如何将空文件夹和符号链接添加到存档 - libarchive
- 协议缓冲区的静态链接会导致与现有符号冲突
- 链接器错误:切换到unicode生成给出:未解析的外部符号WinMain
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 使用共享库编译可执行文件时仅链接所需的符号
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 未定义的引用,即使库正在链接并且它包含正确的符号
- C++ 链接器错误 LNK 2019 函数中引用的未解析的外部符号
- boost::存在符号链接不取消引用
- 检测无意的弱链接符号
- c++ Linux静态变量的双重析构.链接符号重叠