从链接中删除库的模块
我在Visual Studio中创建了lib。 Lib有两个模块:A.cpp和B.cpp。 在单独的项目中,我链接到这个库,但我想禁用此lib的模块之一,即B.cpp。从链接中删除库的模块
你可能不需要拆分你的lib。
只有当您的可执行文件(exe/dll)还有未解析的符号时,才会链接lib的必需内容。 不必要的内容一般地讲不挂
例如:
假设你的lib目录包含有2 OBJ-文件,A.OBJ从a.cpp和B.OBJ从b .cpp。等等
a.cpp包含调用函数void b(int j).
b.cpp包含函数void b(int j)
功能void a(int i)
。
并假设你的可执行文件中的源文件,一个包含一个函数
void b(int k)
的执行情况和其他一些一段代码,你必须void a(int)
通话。
当您链接到lib时,链接器在一个阶段留下1个未解析的符号(即调用函数void a(int)
)。它将搜索您为第一次出现此类函数签名而指定的库,以及因为你的可执行代码已经包含执行void b(int)
它不需要搜索任何库来解决它在a.obj中的调用,所以b.obj不会被链接。
总结(非常简化):
只要你不直接或间接地调用\使用b.obj中的任何东西,它将不会被链接(除非在链接cmd中指定一个lib为OBJ = YourLib.lib,这会引入整个库)。
如果您直接或间接调用b.obj中实现的东西,并在可执行文件中实现这些符号(函数或全局变量),那么b.obj的这些部分将不会链接到功能级链接指定),否则如果您忘记了某些内容,将会出现重复的符号链接错误。
将项目拆分为两部分,其中一部分包含A.cpp
,另一部分包含B.cpp
。然后,如果您需要链接到两个.cpp
文件,则必须链接到两个.lib
文件。但是如果你想链接到一个,那么你可以这样做。
这个问题有点难以遵循。如果将'A.cpp'和'B.cpp'编译为一个静态库,则不仅可以链接该库的一部分。如果是这样的话,你需要实现两个静态库,每个模块一个。 – Chad