使用 gcc 查找要在项目中链接的 .o 文件顺序的任何工具

Any tools to find order of .o files to be linked in a project using gcc

我正在移植 vc++ 项目以在 Linux 平台上工作 我使用 g++ 作为我的编译器。我解决了 g++ 上的编译问题,并且能够为 vc++ 项目中的每个源文件生成 .o 文件,现在我必须 link 它们来生成最终的可执行文件 我可以做到

g++ file1.o file2.o -o file.out

但是当我在我的 make 文件中这样做并执行它时,由于依赖性

会出现很多 ld 错误

有什么办法可以弄清楚提供对象文件的顺序吗? 是否有任何工具可以执行此操作或任何具有顺序的 vc++ 项目文件?

你说 "vc++",但你使用的是 "gcc"(通常是 g++”)。可能你缺少一个或多个库,你可以用“-l”指定选项(记录为 ld 和 gcc 的一部分)。

区别很重要,因为每个包装器(gcc 和 g++)都会将相应的运行时库添加到它传递给 ld.

的选项中

共享库的顺序(Linux 最常见的形式)应该无关紧要(linker 进行两次传递以解析符号)。不久前,在共享库普及之前,我编写了一个程序(名为 liborder,并提到了 here),它分析了“.o”对象和“-l”(静态库)的集合,以打印“-l”选项的推荐顺序。这适用于小程序,但不适用于复杂程序。例如,大约 20 年前 Oracle 的运行时库都是静态的,需要按正确顺序列出 15-20 个库才能成功 link。我的程序无法处理。然而,从那时起,共享库(没有排序问题)已经足够普遍,以至于我没有费心打包 liborder 供其他人使用(它仍然在与其他十几个程序的待办事项列表中) ).

如果您的程序使用 而不是 C/C++ 标准库中的 符号,那么您必须自己确定。我想可以有一个程序在所有开发库中搜索给定的符号,但这看起来很浪费,因为只有一小部分是相关的。我在 /usr/lib.

中看到了其中的 200 个

相反,我通过以可读形式显示来自 nm 的符号 -

使我很容易看到我的程序缺少什么

对于 C,我使用脚本(here as "externs" and "imports") to check which symbols are exported or imported from a collection of ".o" files. The scripts use the output of the nm 程序,它显示给定的符号。

对于 C++,nm 有一个选项“-C”,它显示符号的完整名称。