我在动态库foolib中有一个静态函数“foo”。我成功地在我的应用程序中加载了foolib。虽然dlsym为“foo”返回NULL
即使是nm实用程序也不会将静态函数列为可导出符号。
据我所知,静态函数的范围仅限于该文件。
不过,有没有办法实现这一目标。
我知道这在C ++中是可能的,不知道如何以及为什么(可能将共享库视为该库中的对象和函数作为接口。)
答案 0 :(得分:4)
static
不仅仅是一个“范围”事物 - static
函数具有内部链接,因此编译器不会在目标文件中写入有关它们存在的信息;以后无法恢复此类信息(在创建动态库时)。
更好:如果它是一个小函数,它可能会在每种情况下都被内联,并且,由于它具有内部链接,因此不需要生成“独立”版本,因此该函数实际上将不再存在编译阶段。
我看到从“外部”获取地址到这样一个函数的唯一实用方法是在同一个翻译单元(即在同一个.cpp文件中)中有另一个函数返回指向{{ 1}}函数,然后导出这样的辅助函数。可行,但如果你问我,那就毫无意义了。 :)
foo
// In foolib
// The static function
static void foo()
{
// ...
}
// Typedef for the function pointer
typedef void (* fooFuncPtr)();
// Helper function to be exported - returns the address of foo
fooFuncPtr fooHelper()
{
return &foo;
}