从链接中删除库模块

Remove module of library from linking

本文关键字:模块 删除 链接      更新时间:2023-10-16

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

您可能不必拆分您的库。

仅当可执行文件 (exe/dll( 中仍有未解析的符号时,才会链接 lib 的必要内容。不必要的内容通常说是不链接的。

例如:

假设您的库包含 2 个 obj 文件,来自 a.cpp a.obj 和来自 b.cpp的 b.obj

a.cpp 包含调用函数void b( int j ).的函数void a( int i )

b.cpp 包含函数 void b( int j )

假设您的可执行文件在其源文件之一中包含函数的实现

void b( int k )

在其他一些代码中,您可以调用void a( int ) .

当您针对 lib 进行链接时,链接器在一个阶段留下 1 个未解析的符号(调用函数的符号void a( int ) .它将搜索您为此类函数签名的第一次出现指定的库,并在该库的该部分中链接。由于您的可执行代码已经包含void b( int )的实现,因此它不需要搜索任何库来解析 a.obj 中的调用,因此 b.obj 不会被链接。

总结(非常简化(:

只要你不直接或间接调用\使用b.obj中的任何内容,它就不会被链接(除非你在链接cmd中将库指定为OBJ=YourLib.lib,它会拉入总库(。

如果您直接或间接调用\使用 b.obj 中嵌入的内容,并在可执行文件中实现这些符号(函数或全局变量(,那么 b.obj 的这些部分将不会链接(在指定函数级链接的情况下(,或者如果您忘记了某些内容,您将收到重复的符号链接错误。

将项目一分为二,一个包含A.cpp,另一个包含B.cpp。然后,如果您需要链接到两个.cpp文件,则必须链接到两个.lib文件。但是,如果您只想链接到一个,那么您可以这样做。