假设您有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不使用的内容,您将得到一个无法解决的外部错误)。