我试图用源文件创建一个静态库。为了说明我面临的问题,让我们考虑以下代码片段:
foo.h
:
void public_fn_exposed_to_client();
foo.cpp
:
#include "foo.h"
#include <iostream>
#define EXPORT __attribute__ ((visibility ("default")))
static void private_fn() {
std::cout << "Hello private world" << std::endl;
}
// Can't declare static as this can be used elsewhere in my lib.
// I tried to make this symbol hidden.
void internal_fn_used_inside_lib(){
std::cout << "Hello Internal Wolrd" << std::endl;
}
EXPORT
void public_fn_exposed_to_client()
{
std::cout << "Hello Outside World" << std::endl;
internal_fn_used_inside_lib();
}
main.cpp
(通常由客户撰写):
#include "foo.h"
int main(int argc, char** argv)
{
// This is all good.
public_fn_exposed_to_client();
}
main2.cpp
(通常由客户撰写):
#include "foo.h"
extern void internal_fn_used_inside_lib();
int main(int argc, char** argv)
{
// Ideally, This should not be allowed
internal_fn_used_inside_lib();
}
汇编:
g++ -o foo.o foo.c -fvisibility=hidden
ar rcs libfoo.a foo.o
ranlib libfoo.a
g++ -o main1 main.cpp -L. -lfoo
g++ -o main2 main2.cpp -L. -lfoo
我想实现main2不被编译/链接的情况。这是为了阻止我的库的客户端使用未公开为API的低级函数。
特别是,如何处理不能声明为静态的函数?
我尝试过的事情:
-
如中所述
this
,我尝试使用带有本地化隐藏标志的objcopy,但没有任何东西阻止客户端再次全球化,对吗?
-
导出地图-我不知道如何使它们与静态存档一起工作。相反,我不知道它们是否适用。