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


图书馆



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

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

假设App仅从libB调用函数,所以我们链接libB-> App

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

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

libA-> libB-> App?= libA-> App
我之所以问是因为我有第三个库要链接到应用程序,但是它具有与A相同的函数名。应用程序不直接依赖于A,因此我觉得使用哪个库并不明确。

工作实例

图书馆

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


图书馆

#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


图书馆

#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 )


即使我觉得调用并不明确,也会导致链接器错误。我是否想联系私人事务?或者您可以不这样做。

最佳答案

在这种情况下,您仅描述了libB所需​​的libA部分将最终出现在libB中(并因此出现在应用程序中),因此,除非libB使用所有libA,否则它与取决于libA的应用程序是不同的(因为在这种情况下,所有libA可供应用程序调用,如果您描述应用程序尝试从libA调用libB不使用的内容,您将得到一个无法解决的外部错误)。

10-07 19:31
查看更多