C++ 从链接中删除库的模块
我在visualstudio中创建了lib。Lib有两个模块:A.cpp和B.cpp。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
在单独的项目中,我链接到此库,但我想禁用此库的一个模块,即B.cpp。将项目拆分为两个,一个包含
A.cpp
,另一个包含B.cpp
。然后,如果需要链接到两个.cpp
文件,则必须链接到两个.lib
文件。但是如果您只想链接到一个库,那么您可以这样做。您可能不需要拆分库
只有当可执行文件(exe/dll)中仍有未解析的符号时,才会链接库的必要内容。
一般来说,不必要的内容是不链接的
例如:
假设您的lib包含两个obj文件,a.obj来自a.cpp和b.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
被编译到一个静态库中,您不能只链接该库的一部分。如果是这种情况,您将需要实现两个静态库,每个模块一个。