C++ 从链接中删除库的模块

C++ 从链接中删除库的模块,c++,visual-studio,C++,Visual Studio,我在visualstudio中创建了lib。Lib有两个模块:A.cpp和B.cpp。 在单独的项目中,我链接到此库,但我想禁用此库的一个模块,即B.cpp。将项目拆分为两个,一个包含A.cpp,另一个包含B.cpp。然后,如果需要链接到两个.cpp文件,则必须链接到两个.lib文件。但是如果您只想链接到一个库,那么您可以这样做。您可能不需要拆分库 只有当可执行文件(exe/dll)中仍有未解析的符号时,才会链接库的必要内容。 一般来说,不必要的内容是不链接的 例如: 假设您的lib包含两个ob

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

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

您可能不需要拆分库

只有当可执行文件(exe/dll)中仍有未解析的符号时,才会链接库的必要内容。 一般来说,不必要的内容是不链接的

例如:

假设您的lib包含两个obj文件,a.obj来自a.cppb.obj来自b.cpp

a、 cpp包含函数
void a(int i)
,该函数调用函数
void b(int j)。

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

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

void b(int k)

在另一段代码中,您可以调用
void a(int)

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

总之(非常简化):

只要您不直接或间接地从b.obj调用\使用任何东西,它就不会被链接到中(除非您在link cmd中指定一个lib为obj=YourLib.lib,它会拉入整个库)


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

这个问题有点难理解。如果
a.cpp
B.cpp
被编译到一个静态库中,您不能只链接该库的一部分。如果是这种情况,您将需要实现两个静态库,每个模块一个。