C++ 是否可以链接到非外部符号?

C++ 是否可以链接到非外部符号?,c++,linker,symbols,C++,Linker,Symbols,是否可以链接到非外部符号,或将其转换为外部符号 我之所以这么问,是因为我想使用的一个(大)图书馆每晚都有一个构建,但带有剥离的符号。我更喜欢每晚使用,而不是花半天时间编译它。剥离库只意味着调试符号被剥离。图书馆的其余部分已就位。链接到此类库时可能遇到的问题是链接器警告缺少调试符号。使用剥离库可能会遇到的另一个问题是在没有正确调试符号的情况下进行调试,这没有什么乐趣 对于外部/非外部(你是说导出)符号的问题,如果你链接到静态库,它不需要定义任何“导出”,因为它就像一个大的对象文件一样链接到你的代码

是否可以链接到非外部符号,或将其转换为外部符号

我之所以这么问,是因为我想使用的一个(大)图书馆每晚都有一个构建,但带有剥离的符号。我更喜欢每晚使用,而不是花半天时间编译它。

剥离库只意味着调试符号被剥离。图书馆的其余部分已就位。链接到此类库时可能遇到的问题是链接器警告缺少调试符号。使用剥离库可能会遇到的另一个问题是在没有正确调试符号的情况下进行调试,这没有什么乐趣

对于外部/非外部(你是说导出)符号的问题,如果你链接到静态库,它不需要定义任何“导出”,因为它就像一个大的对象文件一样链接到你的代码。链接到动态库时,根据您感兴趣的平台略有不同。在windows上,dll需要声明要用作
(declspec)\uu dllexport
的函数。在linux上,如果内存为我服务,则无需声明任何类似的内容,您可以使用.so文件中的函数,就像它们将出现在代码中一样,类似于静态库

更新:


Alex,我不是100%确定,但我相信,我写的关于linux的内容适用于本例中的OSX。只要您有一个带有函数声明的头文件,您就应该能够很好地使用它们。如果您在提供的头文件中没有一些函数,但可以访问源文件,那么您可以创建自己的函数。然而,这是一个相当糟糕的想法,因为SDK的作者不想让您访问这些函数,也没有将它们添加到公共头文件中,所以他们可以随时根据自己的需要修改其功能,这可能会给您留下无法工作的代码,并且需要重写/重新设计某些内容。这同样适用于所有“未记录”的功能,它们可能会被修改或删除,如果它给您带来问题,您是唯一有罪的人,也是唯一关心的人。小心操作。

否。不可能链接到非外部符号

根据定义,非外部符号不会从编译器/汇编器/任何东西导出到链接器。当链接器看到要链接的模块时,这些符号就消失了,从宇宙中消失了,只是一个逐渐消失的记忆

早在铁器时代早期,计算机仍然是由分立晶体管制成的,编译器和汇编程序可以被命令为每个模块打印符号表。今天,我们称之为“调试信息”,它通常不打印,而是存储在调试工具可以在加载模块中找到它的地方。而这正是你夜间身材中被剥夺的东西


你想做什么?如果您试图访问库中显式非外部的例程(或变量),那么,它们可能是非外部的。与库的维护人员交谈,解释您为什么希望访问这些例程(或变量),并听取他们关于为什么不提供访问权限的解释。

我倾向于说不,只要问题是这样的


例如,链接器可以对内部函数执行调用方/被调用方优化,而外部函数则不能。例如,它可能检测到没有呼叫者关心某个寄存器的保存,并在被呼叫者prolog代码中优化taht寄存器的保存

我知道它很古老,但我一直在寻找同样的东西,似乎这种技术可能会奏效:


对不起,我不是很具体。它是一个OSX框架(所以是一个动态库)。库仅导出某些符号-其中大多数是“非外部”符号。我想知道我是否可以访问这些非外部符号。但是这些符号仍然存在——如果我使用“nm-m WebCore”,我可以看到它们,我只是无法链接到它们(因为它们是非外部的)。它们之所以是私有的,是因为WebCore是WebKit的一个伞式框架,而WebKit为WebCore提供了一个公共API。遗憾的是,API只是目标C,不是C++,因此我想绕过它。不过我恐怕不可能。