假设您有 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/