C .lib中的函数已定义,但当我生成.so时,从相同的.lib中该函数不存在
我有一个lib1.lib,它有一个fun1()函数,当我执行nm时,它会显示已定义的函数。 我已经用我的.lib创建了我的.so。但当我搜索my.so时,fun1()根本不存在。因为可能没有调用方,编译器可能会忽略它。 所以我创建了一些虚拟数组,比如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是字符,编译
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
被声明为全局或静态变量,将确保加载函数。