库链接器传播:libA->libB->App 是否与 libA->App<-libB 相同

Library Linker Propagation: is libA->libB->App the same as libA->App<-libB

本文关键字:gt App libA- 是否 -libB 相同 lt libB- 链接 传播      更新时间:2023-10-16

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

  • libA
  • libB

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

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

假设 App 只调用 libB 中的函数,所以我们链接libB->App

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

简而言之,我的问题是这样的:

libA->libB->App ?=libA->App<->libB

我问是因为我想链接到应用程序的第三个库,但它与 A 有一些相同的函数名称.App 不直接依赖 A,所以我觉得使用哪一个并不模棱两可。

工作示例

利巴·

#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 Onen");
}
void A_FunctionTwo()
{
printf("Library A Function Twon");
}
void A_FunctionThree()
{
printf("Library A Function Threen");
}
}

LibA2.c

#include "LibA2.h"
#include <iostream>
extern "C"
{
void A_FunctionOne()
{
printf("Library A2 Function Onen");
}
void A_FunctionTwo()
{
printf("Library A2 Function Twon");
}
void A_FunctionThree()
{
printf("Library A2 Function Threen");
}
}

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 1n");
A_FunctionOne();
}
void LibB::B_FunctionTwo()
{
printf("Library B, Function 2.  Calling Library B, Function 1n");
B_FunctionOne();
}

应用.cpp

#include "LibB.h"
#include "LibA2.h"
#include <iostream>
int main()
{
LibB foo;
printf("Main, calling LibB, Function 1n");
foo.B_FunctionOne();
printf("Main, calling LibA2, Function 1n");
A_FunctionOne();
}

CMakeList.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 )

这会导致链接器错误,即使我觉得调用并不模棱两可。 我是否错过了将链接作为私人事务的东西? 或者你可以不这样做。

在这种情况下,您只描述libB需要的libA部分最终会出现在libB中(因此在应用程序中),因此除非libB使用所有libA,否则它与依赖于libA的应用程序不同(因为在这种情况下,所有libA都可以供应用程序调用, 如果您描述的内容,如果应用程序尝试从libA调用libB不使用的内容,您将获得未解决的外部错误)。

取决于链接器。

对于大多数Unix链接器来说,链接顺序很重要;需要符号的对象必须位于链接命令行上提供符号的对象之前。 一些链接器(如Microsoft提供的链接器)不在乎。

无论如何;如果您总是按照需要符号的对象在提供符号的对象之前的顺序链接对象,则可以使用任何链接器。