gpt4 book ai didi

c++ - 静态库中的符号可见性和操作

转载 作者:行者123 更新时间:2023-11-30 05:03:54 27 4
gpt4 key购买 nike

我正在尝试从我的源文件中创建一个静态库。为了说明我面临的问题,让我们考虑以下片段:

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,但没有什么能阻止客户端再次将其全局化,对吗?

  • 导出 map - 我不知道如何使它们与静态存档一起使用。相反,我根本不知道它们是否适用。

最佳答案

不可能。静态库可以被认为是所有未链接目标文件的单个文件存档。因此,可见的是链接目标文件的内容从整个静态库中可见。

“隐藏”事物的唯一方法是不提供头文件,但没有什么能阻止您用户自己重新创建这些头文件。

关于c++ - 静态库中的符号可见性和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com