gcc:允许未定义的符号

时间:2012-02-08 19:21:44

标签: c gcc linker

我不希望gcc链接器将未定义的符号显示为链接错误。我在MAC OSX 10.6上使用gcc 4.2

当然我在线寻找解决方案,但所有尝试都失败了!

如何修改此命令以摆脱未定义的符号错误?

gcc -o Proj $(wildcard *.o);

感谢。

编辑:我正在开展一个研究项目,在那里我需要代码可链接&我不在乎它是否会有运行时异常

3 个答案:

答案 0 :(得分:5)

咦?这是没有意义的。它错误,不能忽略。当链接器无法完成其工作时,您无法构建可执行文件。您是否希望它只是简单地发明一个实现并希望它能够实现?

相反,您需要了解如何正确配置要构建的项目。如果依赖外部库,则需要在链接器搜索路径中添加路径。

编辑:根据你的评论...

  

有一些选项可以抑制链接错误,比如这里的sourceware.org/binutils/docs/ld/Options.html我正在研究一个研究项目,我需要这些代码可以链接。我不在乎它是否会有运行时异常

嗯,你仍然不能,它仍然没有任何意义。请仔细阅读该部分:

  

在链接时指定共享库中允许未定义的符号引用的原因是:

     

链接时指定的共享库可能与加载时可用的共享库不同,因此该符号实际上可以在加载时解析。   有一些操作系统,例如BeOS和HPPA,共享库中的未定义符号是正常的。

因此,在某些情况下,允许在共享库中使用未定义的符号 是合理的,因为您可能无法链接到您将在实践中链接到的动态库的相同版本。

但是,您希望构建一个可执行文件,而不是共享库,因此毫无意义可以执行您要求的操作。你只需要一个可执行的东西,它将无法使用。为什么任何理智的编译器都允许这样的条件?

答案 1 :(得分:2)

您可以改用ld -r -o Proj.o $(wildcard *.o) 您将获得的不是您可以运行的可执行文件,而是一个目标文件,您可以将其链接到可执行文件中。在最后的链接中,您必须提供未解析的符号。

答案 2 :(得分:0)

您可能想要创建一个库而不是exe。这些不应该生成链接器错误。

ar r libProj.a $(wildcard *.o)
ranlib libProj.a