我正在尝试编译一个使用udis86库的程序.实际上我正在使用库的用户手册中给出的示例程序.但是在编译时,它会给出错误.我得到的错误是:
example.c:(.text+0x7): undefined reference to 'ud_init'
example.c:(.text+0x7): undefined reference to 'ud_set_input_file'
.
.
example.c:(.text+0x7): undefined reference to 'ud_insn_asm'
Run Code Online (Sandbox Code Playgroud)
我使用的命令是:
$ gcc -ludis86 example.c -o example
Run Code Online (Sandbox Code Playgroud)
按照用户手册中的说明进行操作.
显然,链接器无法链接libudis库.但如果我改变命令:
$ gcc example.c -ludis86 -o example
Run Code Online (Sandbox Code Playgroud)
它开始工作.那么可以请某人解释第一个命令的问题是什么?
作为C的初学者,我可以理解文件中对函数原型的需求,但我不确定几件事情.
首先,在main之外的每个函数调用是否需要原型声明?有什么条件可以改变吗?
其次,您是否需要单独的函数原型来进行方法重载?
希望这是一个非常简单的问题.以下是我的C pgm(test.c).
#include <stdio.h>
//#include <stdlib.h>
int main (int argc, char *argv[]) {
int intValue = atoi("1");
double doubleValue = atof("2");
fprintf(stdout,"The intValue is %d and the doubleValue is %g\n", intValue, doubleValue);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意,我正在使用stdlib.h中的atoi()和atof(),但我没有包含该头文件.我编译pgm(gcc test.c)并且没有编译错误!
我运行pgm(./a.out),这是输出,这是错误的.
The intValue is 1 and the doubleValue is 0
Run Code Online (Sandbox Code Playgroud)
现在我包含stdlib.h(通过删除#include之前的注释)并重新编译它并再次运行它.这次我得到了正确的输出:
The intValue is 1 and the doubleValue is 2
Run Code Online (Sandbox Code Playgroud)
为什么编译器没有抱怨不包含stdlib.h并且仍然让我使用atoi(),atof()函数?
我的gcc信息:
$ gcc --version
gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-27)
Run Code Online (Sandbox Code Playgroud)
任何想法赞赏!
如果你用GCC编译一个共享库并传递"-z defs"标志(我认为它只是盲目地传递给ld)那么你得到一个很好的报告,没有定义什么符号,并且ld失败(没有.so文件)被建造).另一方面,如果你没有指定"-z defs"或明确指定"-z nodefs"(默认值),那么即使缺少符号也会生成.so,但是你没有得到什么符号的报告如果有的话会失踪.
我想要两个!我想要创建.so,但我也想要报告任何缺少的符号.到目前为止,我知道这样做的唯一方法是运行两次,一次使用"-z defs",一次不使用.这意味着潜在的长链接阶段会完成两次,这将使编译/测试周期更加糟糕.
如果您想知道我的最终目标 - 在编译库时,本地目标文件中的未定义符号表示未指定应该在我的构建环境中的依赖项,而如果库中缺少某个符号,那么'链接不是一个错误(-l标志只给出了立即依赖,而不是依赖的依赖,在这个系统下).我需要列出"在文件中引用"的部分的报告,以便我可以看到符号是由本地对象引用还是被链接的库引用.--allow-shlib-undefined选项几乎修复了这个问题,但在链接静态库时它不起作用.
优先考虑适用于GNU和Solaris链接器的解决方案.
是否有用于忽略未定义引用的编译器选项?我正在Linux下编译C++代码.