假设您有3个项目。其中2个是静态库。我们会打电话给他们:
最后一个是您的申请。我们将此称为应用
假设 libB 调用 libA 中的函数,因此我们链接 libA - > libB
假设 App 仅调用 libB 中的函数,因此我们链接 libB - > 应用
这是否意味着 libA 现在也链接到 App?
简而言之,我的问题是:
libA - > libB - > 应用?= libA - > 应用< - libB
我问,因为我有第三个我要链接到app的库,但是它有一些与A相同的函数名.App不直接依赖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 )
这会导致链接器错误,即使我觉得调用不明确。我错过了将私人事件联系起来的东西吗?或者你可以不这样做。
答案 0 :(得分:1)
在这种情况下,你只描述了libB所需的libA部分将最终存在于libB中(因此在应用程序中),所以除非libB使用了所有的libA,否则它与应用程序的libA不同(因为在在这种情况下,应用程序可以调用所有libA,如果应用程序试图从libA调用libB不使用的内容,那么你所描述的内容将会得到一个未解决的外部错误。)
答案 1 :(得分:0)
取决于链接器。
对于大多数Unix链接器,链接或重要事项;需要符号的对象必须位于链接命令行上提供符号的对象之前。 一些链接器(如微软提供的那些)不关心。
无论如何;如果你总是按照需要符号的对象的顺序链接对象,那么你可以使用任何链接器。