定义了.lib中的函数,但是当我从同一.lib生成.so时,函数不存在

时间:2016-12-29 09:13:58

标签: c linux gcc gdb

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

char* dummyArray={
 &fun1;
};

在定义fun1()的文件中。 但这也行不通。 请帮助。

2 个答案:

答案 0 :(得分:1)

您需要强制编译器和链接器从库中获取函数。在您当前的尝试中,您在程序中引用了一个名为fun1的角色。因为fun1是char,所以编译器没有理由在.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仍然不会加载。

答案 1 :(得分:1)

直接换行

bool sameSign = ((n1 < 0) == (n2 < 0)); 
链接时的

.so。有关背景信息,请参阅c-differ-between-linking-with-o-and-with-a-file-different-behavior-why