提问人:ron 提问时间:5/15/2020 更新时间:5/19/2020 访问量:522
AR、链接和未定义引用的问题
problem with ar, linking and undefined reference
问:
我有一个软件包,其中包含一些 500+ fortran .f 文件。它被很好地组织成各种子文件夹,并且有一个高级编译脚本调用子文件夹中的各种 Makefile。
使用 PGI 编译器,我在 SLES 11.4 x86_64上执行此操作。
没有编译错误。
问题发生在最后,当链接尝试创建一个可执行文件时,结果是相同的 10 个左右对各种函数的未定义引用。我已经浏览了所有的 Makefile,其中没有遗漏的语句,对于所述的未定义引用,它们各自的文件存在于文件夹中,并且我还认识到所有这些文件都用于创建文件。.o
objects/
.o
.a
在整个编译过程中总共创建了 3 个文件,在编译了 50 个左右的 .f 文件后,会打印出随后运行 ar
的位置。对于每个 和 和 在编译期间,这种情况会发生很多次。.a
Updating whatever#.a
whatever1.a
whatever2.a
whatever3.a
问题是,我知道我能说的 Makefile 中没有错误,我可以触发一个 .f 的重新编译,它对应于一个未定义的引用,当该文件更新并链接时,特定的未定义引用消失了。所以我尝试为其他人这样做,有时它有效,但有些则无效,这似乎是偶然的,我能够以这种方式为一些未定义的引用修复它。whatever#.a
另一件主要的事情是创建所有对象文件,如果我简单地删除所有 3 个文件并运行编译脚本,那么只有碰巧重新创建这 3 个文件,然后是最终链接,然后说一大堆不同的未定义引用。.o
.a
ar
.a.
我相信问题在于它的版本的使用和/或操作系统有问题。有人知道真正的原因以及如何解决这个问题吗?我正在考虑修改编译脚本,而不是链接 3 个文件,以手动导致与所有 ~500 文件的链接并完全删除它。ar
.a
.o
ar
可以放入文件中的文件数量是否有限制?.o
.a
.ar
答:
终于让我的源文件链接了。解决方案是按照打印未定义引用的顺序从最后到第一名工作......
我会转到那些特定文件所在的子文件夹,未定义的引用抱怨。/objects/whatever/
.o
我只是删除了这些文件,然后重新运行了我的编译脚本,该脚本调用了一个 Makefile,它只重新编译了这些文件,然后将这些文件放入现有库中。然后那些特定的未定义引用消失了。我对最初出现的 10 到 15 个未定义的参考文献重复了这一点,最终取得了成功。.o
.f
ar r
.a
对现有文件执行或 ranlib 操作无济于事。所以我想这是一个编译顺序,并包含在文件中,这是问题所在吗?因为我最初知道所有必要的文件都在这三个文件中。ar -s
.a
.a
.o
.a
评论
libA
libB
libC
libA
undef1
libB
undef1
libA
libA
libB
libC
-lA -lB -lC -lA -lB -lC
libABC
-lABC
ld
ranlib
ar s
ar
.a
ranlib
ar
ar
ranlib
ranlib
ar
.a
.o
.a
ar