从链接中删除库的模块

时间:2011-10-11 18:53:32

标签: c++ visual-studio

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

2 个答案:

答案 0 :(得分:1)

您可能不必拆分您的lib。

只有在您的可执行文件(exe / dll)中剩余未解析的符号时,才会链接lib的必要内容。 一般而言,不必要的内容没有链接。

例如:

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

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

的函数void b( int j ).

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

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

void b( int k )

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

当你链接lib时,一个阶段的链接器留下1个未解析的符号(调用函数void a( int )的符号。它将搜索你为第一次出现这样一个函数指定的库-signature,它链接在该lib的那一部分。 由于您的可执行代码已包含void b( int )的实现,因此无需搜索任何lib以解析 a.obj 中的调用,因此 b.obj 不会被链接。

总结(非常简化):

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

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

答案 1 :(得分:0)

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