2011-10-11 79 views
0

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

+0

这个问题有点难以遵循。如果将'A.cpp'和'B.cpp'编译为一个静态库,则不仅可以链接该库的一部分。如果是这样的话,你需要实现两个静态库,每个模块一个。 – Chad

回答

1

你可能不需要拆分你的lib。

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

例如:

假设你的lib目录包含有2 OBJ-文件,A.OBJa.cppB.OBJb .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的这些部分将不会链接到功能级链接指定),否则如果您忘记了某些内容,将会出现重复的符号链接错误。

0

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