我在Visual Studio中创建了lib。 Lib有两个模块:A.cpp和B.cpp。 在单独的项目中我链接到这个库,但我想禁用此库中的一个模块,即B.cpp。
答案 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
文件。但是如果你想链接到一个,那么你可以这样做。