库链接器传播:libA->libB->App 是否与 libA->App<-libB 相同
Library Linker Propagation: is libA->libB->App the same as libA->App<-libB
假设你有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提供的链接器)不在乎。
无论如何;如果您总是按照需要符号的对象在提供符号的对象之前的顺序链接对象,则可以使用任何链接器。
相关文章:
- EASTL矢量<向量<int>>连续的
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- Mac os x app bundle 在下载并运行时崩溃,但在终端或更改 Info.plist 时运行良好
- Firebase C++VS2018 SDL2-在Firebase::app::create(..)上执行异常处理
- 使用MSVC编译的Qt程序在app.exec()上崩溃
- 终端错误MacOS:/Applications/Xcode.app/Content/Developer/Toolchai
- 从Qt/C++-App并行运行两个Lua函数
- Google App Engine 会在实例休眠后缓存编译的 go 代码吗?
- ios::app 和 ios::noreplace 模式在文件处理中有什么区别?
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C 字符串比较“祝您好运”&gt;“再见”
- [UWP][C++] 如何更改 App.xaml 的位置
- 如何在没有.app的情况下,在 macOS 上使用 qmake 获取二进制文件
- g++:错误:/u01/app/orace/product/11.2.0/xe/lib/lclasses12.zip:此
- 将C 代码编译到独立应用程序.App
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- MFC App中的QT DLL-如何使Qdialog *真正 *模式
- {app.exe!_com_error::'vector delete destructor'(unsigned int)}
- 库链接器传播:libA->libB->App 是否与 libA->App<-libB 相同
- javah:错误:无法访问android.support.v7.app.AppCompatActivity