C++ 库链接器传播:是否为libA->;libB->;应用程序与libA相同->;应用程序<-libB

C++ 库链接器传播:是否为libA->;libB->;应用程序与libA相同->;应用程序<-libB,c++,linker,C++,Linker,假设你有3个项目。其中2个是静态库。我们称之为: libA libB 最后是你的申请。我们称之为应用程序 #include "LibB.h" #include <iostream> #include "LibA.h" LibB::LibB() {} void LibB::B_FunctionOne() { printf("Library B, Function 1. Calling Library A, Function 1\n"); A_FunctionOn

假设你有3个项目。其中2个是静态库。我们称之为:

  • libA
  • libB
最后是你的申请。我们称之为应用程序

#include "LibB.h"
#include <iostream>
#include "LibA.h"

LibB::LibB()
{}
void LibB::B_FunctionOne()
{
    printf("Library B, Function 1.  Calling Library A, Function 1\n");
    A_FunctionOne();
}
void LibB::B_FunctionTwo()
{
    printf("Library B, Function 2.  Calling Library B, Function 1\n");
    B_FunctionOne();
}
#include "LibB.h"
#include "LibA2.h"
#include <iostream>

int main()
{

    LibB foo;
   printf("Main, calling LibB, Function 1\n");
    foo.B_FunctionOne();

   printf("Main, calling LibA2, Function 1\n");
    A_FunctionOne();
}
假设libB调用libA中的函数,那么我们将libA->libB

假设App只调用libB中的函数,那么我们将libB->App

#include "LibB.h"
#include <iostream>
#include "LibA.h"

LibB::LibB()
{}
void LibB::B_FunctionOne()
{
    printf("Library B, Function 1.  Calling Library A, Function 1\n");
    A_FunctionOne();
}
void LibB::B_FunctionTwo()
{
    printf("Library B, Function 2.  Calling Library B, Function 1\n");
    B_FunctionOne();
}
#include "LibB.h"
#include "LibA2.h"
#include <iostream>

int main()
{

    LibB foo;
   printf("Main, calling LibB, Function 1\n");
    foo.B_FunctionOne();

   printf("Main, calling LibA2, Function 1\n");
    A_FunctionOne();
}
这是否意味着libA现在也链接到应用程序?

简言之,我的问题是:


libA->libB->App?=libA->App在这种情况下,您只描述libB所需的libA部分将最终出现在libB中(因此也出现在App中),因此除非libB使用所有libA,否则根据libA的不同,libB与App不同(因为在这种情况下,应用程序可以调用所有的libA,如果应用程序尝试调用libB不使用的libA,您将得到一个未解决的外部错误)。

取决于链接器

对于大多数Unix链接器,链接顺序很重要;需要符号的对象必须在链接命令行上提供符号的对象之前。 有些链接器(比如微软提供的链接器)并不在意


在任何情况下,如果您总是按照需要符号的对象在提供符号之前的顺序链接对象,那么您可以使用任何链接器。

也就是说,如果libA有函数A1、A2、An,libB有函数B1、B2、Bn,libB使用函数A1,但在这种情况下,A1被链接到App,即使它从来都不是dir通常由应用程序调用,但它仅在libB中调用?您的符号有点奇怪。a->B通常表示“a依赖于B”。这意味着libB->libA看起来不错。libB->App表示“libB依赖于应用程序”,这不是您的文本所说的(无论如何,这会很奇怪)。很好。这实际上是一个错误,与问题的其余部分不一致。我在别处听到的一个建议是将库包装在名称空间中。不幸的是,这些库是第三方代码。有没有办法在不修改libA/libC源代码的情况下做到这一点?@Michael Smith
namespace libA{include}
@Jesper Juhl不幸的是,这不起作用。在本例中,LibB和App都使用Lib2A的实现。虽然这听起来像是一系列问题本身,但我想我的问题更像是“这会演变成一个巨大的Katamari,还是你能调用只与之直接关联的函数?”@迈克尔·史密斯,嗯?这和我的回答有什么不同?你到底在问什么?我在上面的问题描述中添加了更多的内容,这为我关心问题的原因提供了一个有效的例子。
#include "LibA2.h"
#include <iostream>

extern "C"
{
   void A_FunctionOne()
   {
      printf("Library A2 Function One\n");
   }

   void A_FunctionTwo()
   {
      printf("Library A2 Function Two\n");
   }

   void A_FunctionThree()
   {
      printf("Library A2 Function Three\n");
   }
}
#include "LibB.h"
#include <iostream>
#include "LibA.h"

LibB::LibB()
{}
void LibB::B_FunctionOne()
{
    printf("Library B, Function 1.  Calling Library A, Function 1\n");
    A_FunctionOne();
}
void LibB::B_FunctionTwo()
{
    printf("Library B, Function 2.  Calling Library B, Function 1\n");
    B_FunctionOne();
}
#include "LibB.h"
#include "LibA2.h"
#include <iostream>

int main()
{

    LibB foo;
   printf("Main, calling LibB, Function 1\n");
    foo.B_FunctionOne();

   printf("Main, calling LibA2, Function 1\n");
    A_FunctionOne();
}
Project( BrainHurts )

add_library( libA STATIC ${CMAKE_CURRENT_SOURCE_DIR}/LibA.c)
add_library( libB STATIC ${CMAKE_CURRENT_SOURCE_DIR}/LibB.cpp )
target_link_libraries( libB libA )

add_library( libC STATIC ${CMAKE_CURRENT_SOURCE_DIR}/LibA2.c )
add_executable( APP ${CMAKE_CURRENT_SOURCE_DIR}/App.cpp)

target_link_libraries( APP libB libC )