库链接器传播:是libA-> libB->应用程序与libA-> App< -libB

时间:2018-01-12 18:05:49

标签: c++ linker

假设您有3个项目。其中2个是静态库。我们会打电话给他们:

  • 利巴
  • libB

最后一个是您的申请。我们将此称为应用

假设 libB 调用 libA 中的函数,因此我们链接 libA - > libB

假设 App 仅调用 libB 中的函数,因此我们链接 libB - > 应用

这是否意味着 libA 现在也链接到 App?

简而言之,我的问题是:

libA - > libB - > 应用?= libA - > 应用< - libB

我问,因为我有第三个我要链接到app的库,但是它有一些与A相同的函数名.App不直接依赖A,所以我觉得它不是模糊的哪一个到使用。

工作示例

LibA.h

#ifndef LIBA_H
#define LIBA_H
   void A_FunctionOne();
   void A_FunctionTwo();
   void A_FunctionThree();
#endif

LibB.h

#ifndef LIBB_H
#define LIBB_H

class LibB
{
public:
    LibB();
    void B_FunctionOne();
    void B_FunctionTwo();

};
#endif

LibA2.h

#ifndef LIBA_H
#define LIBA_H

void A_FunctionOne();
void A_FunctionTwo();
void A_FunctionThree();
#endif

LibA.c

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

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

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

   void A_FunctionThree()
   {
      printf("Library A Function Three\n");
   }
}

LibA2.c

#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");
   }
}

LibB.cpp

#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();
}

App.cpp

#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();
}

的CMakeLists.txt

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 )

这会导致链接器错误,即使我觉得调用不明确。我错过了将私人事件联系起来的东西吗?或者你可以不这样做。

2 个答案:

答案 0 :(得分:1)

在这种情况下,你只描述了libB所需​​的libA部分将最终存在于libB中(因此在应用程序中),所以除非libB使用了所有的libA,否则它与应用程序的libA不同(因为在在这种情况下,应用程序可以调用所有libA,如果应用程序试图从libA调用libB不使用的内容,那么你所描述的内容将会得到一个未解决的外部错误。)

答案 1 :(得分:0)

取决于链接器。

对于大多数Unix链接器,链接或重要事项;需要符号的对象必须位于链接命令行上提供符号的对象之前。  一些链接器(如微软提供的那些)不关心。

无论如何;如果你总是按照需要符号的对象的顺序链接对象,那么你可以使用任何链接器。