我已经在 Visual Studio 中制作了 lib。 Lib 有两个模块:A.cpp 和 B.cpp。 在单独的项目中,我链接到这个库,但我想禁用这个库的模块之一,即 B.cpp。
最佳答案
您可能不必拆分您的库。
只有当您的可执行文件 (exe/dll) 中存在未解析的符号时,才会链接必要的 lib 内容。 不需要的内容一般不链接进去。
例如:
假设您的库包含 2 个 obj 文件,a.obj 来自 a.cpp 和 b.obj 来自 b。 cpp.
a.cpp 包含调用函数 void b( int j ) 的函数
void a( int i )
。
b.cpp 包含函数 void b( int j )
。
假设您的可执行文件在其源文件之一中包含函数的实现
void b( int k )
在其他一些代码中,您调用了 void a( int )
。
当您链接库时,链接器在某个阶段留下 1 个未解析的符号(调用函数 void a( int )
的符号)。它将搜索您指定的库这种函数签名的第一次出现,它链接在该库的那部分。
由于您的可执行代码已经包含 void b( int )
的实现,因此它不需要搜索任何库来解析 a.obj 中对它的调用,所以 < strong>b.obj 不会被链接进来。
总结(非常简单):
只要您不直接或间接调用\使用 b.obj 中的任何内容,它就不会被链接(除非您在链接 cmd 中将一个库指定为 OBJ=YourLib.lib,这会拉入总数库)。
如果你直接或间接地调用\使用 b.obj 中实现的东西,并且你在你的可执行文件中实现了这些符号(函数或全局变量),那么 b.obj 的那些部分将不会被链接(在函数的情况下) -level linking specified) 或者如果你忘记了什么,你会得到重复的符号链接(symbolic link)错误。
关于c++ - 从链接中删除库模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7731002/