C .lib中的函数已定义,但当我生成.so时,从相同的.lib中该函数不存在

C .lib中的函数已定义,但当我生成.so时,从相同的.lib中该函数不存在,c,linux,gcc,gdb,C,Linux,Gcc,Gdb,我有一个lib1.lib,它有一个fun1()函数,当我执行nm时,它会显示已定义的函数。 我已经用我的.lib创建了我的.so。但当我搜索my.so时,fun1()根本不存在。因为可能没有调用方,编译器可能会忽略它。 所以我创建了一些虚拟数组,比如 char* dummyArray={ &fun1; }; 在定义fun1()的文件中。 但这也不起作用。 请提供帮助。您需要强制编译器和链接器从库中获取函数。在当前尝试中,您在程序中引用了一个名为fun1的字符。由于fun1是字符,编译

我有一个lib1.lib,它有一个fun1()函数,当我执行nm时,它会显示已定义的函数。 我已经用我的.lib创建了我的.so。但当我搜索my.so时,fun1()根本不存在。因为可能没有调用方,编译器可能会忽略它。 所以我创建了一些虚拟数组,比如

char* dummyArray={
 &fun1;
};
在定义fun1()的文件中。 但这也不起作用。
请提供帮助。

您需要强制编译器和链接器从库中获取函数。在当前尝试中,您在程序中引用了一个名为
fun1
的字符。由于
fun1
是字符,编译器没有理由在.o文件中声明一个名为
fun1
的函数符号。因此,函数
fun1
将不会从库中提取,并且可执行文件中没有函数
fun1

(请注意,在您的示例中,没有声明
char fun1
,因此您的编译器应该会抱怨。是否打开了警告??)

要强制编译器和链接器从库中加载函数
fun1
,可以编写:

char *fun1(void);    // prototype;

char *(*p)(void)     // p is a pointer to a function with same signature as fun1...
     = fun1;         // and we initialize it with function 'fun1'
注意:如果编译器确定您从未使用过
p
,它仍然可能会删除函数指针变量和
fun1
对它的赋值,因此
fun1
仍然不会被加载。

只需换行即可

-Wl,--whole-archive -lyourlib -Wl,--no-whole-archive

当链接时。所以。有关背景信息,请参见示例中的
fun1
是一个[指向]字符的指针,而不是指向函数的指针。此标识符与库中的标识符没有冲突。但是,编译器会抱怨
fun1
未定义,因此请打开编译器警告。当我在lib1.lib上执行nm时,我可以看到符号已定义,但为什么在生成时它已定义。因此,符号根本不在那里??因为您不使用名为
fun1
的函数(您只使用名为
fun1
的字符),链接器将不会从库中获取函数。将尝试与Valu** PaulOgilvie相同。类型仅在C++的情况下与名称的命名有关(并且我怀疑这是OPS问题)。是否有编译器选项来让编译器不忽略那些不被调用的函数??如果
p
被声明为全局或静态变量,将确保加载函数。