【发布时间】:2020-01-14 09:16:07
【问题描述】:
我有一个静态库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
有没有办法解决这个问题?一些编译器设置告诉只链接实际需要的符号。 一种解决方法是一些虚拟实现,但我更喜欢某种方式,只在需要这些部分时才强制 lib 的用户做某事
【问题讨论】:
-
请向我们展示编译和链接所有工件的命令。 (对不起,过早的回答,我被这两个函数的单个代码块误导了。)
-
@thebusybee 我只是想为您的答案添加一些额外的评论。也许现在还为时过早。代码非常大,
staticLib中的源文件之间的某些依赖关系可能会导致其他目标文件的链接。像 fileB 中的其他函数一样,使用 fileC 中的函数,其中包含使用 fileA 中其他函数的函数。我仍然强烈希望在函数级别上,dynLib 中使用的函数不会直接依赖于调用 extLib-Functions 的函数。 -
您可以向链接器索取交叉引用,这可能有助于解决这个问题。
-
@thebusybee 你能给我一些关于这个的链接吗?仅找到 .net 引用
-
我不使用 Visual C... 微软的工具似乎无法做到这一点(再次失败。)快速搜索显示this page of options。在 GCC 上,
-Wl,--cref将选项-c-ref提供给链接器。是时候更换编译器了?
标签: c++ c visual-studio visual-c++ linker