c++ - 库链接器传播 : is libA->libB->App the same as libA->App<-libB

标签 c++ linker

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

  • libA
  • libB

最后是您的应用程序。我们将调用此App

假设 libB 调用了 libA 中的函数,那么我们链接 libA->libB

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

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

简而言之,我的问题是:

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

我问是因为我有第三个库我想链接到应用程序,但它有一些与 A 相同的函数名称。应用程序不直接依赖于 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 )

这会导致链接器错误,尽管我觉得调用没有歧义。我是否遗漏了一些使私有(private)事务联系起来的东西?或者你能不能不这样做。

最佳答案

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

关于c++ - 库链接器传播 : is libA->libB->App the same as libA->App<-libB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48231804/

相关文章:

c++ - MSXML DOM : Add namespace declaration to an existing node in a tree

Ubuntu 11.10 上的 c 数学链接器问题

c++ - 为什么链接器不能防止 C++ 静态初始化顺序失败?

c++ - Boost.Bind'ing 成员函数并将其发布到 io_service

c# - linux下C++中Gmap.Net的替代品

c++ - 为什么GCC认为constexpr静态数据成员的定义必须标记为constexpr?

ios - 将使用 Clang 构建的库添加到使用 GCC 构建的 iOS 应用程序时出现链接错误

gcc - gperftools CPU 分析器究竟是如何启动的?

c - 链接到 Cmake 中不存在的共享库

c++ - (bool | bool) 安全吗?