c++ - 从链接中删除库模块

标签 c++ visual-studio

我已经在 Visual Studio 中制作了 lib。 Lib 有两个模块:A.cpp 和 B.cpp。 在单独的项目中,我链接到这个库,但我想禁用这个库的模块之一,即 B.cpp。

最佳答案

您可能不必拆分您的库。

只有当您的可执行文件 (exe/dll) 中存在未解析的符号时,才会链接必要的 lib 内容。 不需要的内容一般不链接进去。

例如:

假设您的库包含 2 个 obj 文件,a.obj 来自 a.cppb.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/

相关文章:

c++ - C++ 程序和 cmd 控制台之间的管道

c++ - 为什么在使用线程池时对 boost::async 的嵌套调用会阻塞?

c++ - 在 C++ 中展平 3D 数组以与 MPI 一起使用

c++ - vector <int> V[]和 vector <vector<int>> V的区别

c++ - 一条定义规则警告

c++ - 使用 case switch 语句加载函数

visual-studio - 如何将.NET 7++添加到Visual Studio 2022++作为目标框架?

c++ - Visual Studio ,C++ : run main() in dll?

git - 覆盖 Git 中的本地更改

c++ - 如何在pytorch C++ API中为模型提供一批框架?