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

标签 linux visual-c++ gcc linker porting

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

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

但是当我在 make 文件中执行此操作并执行它时,由于依赖关系,会出现很多 ld 错误

有什么方法可以弄清楚提供目标文件的顺序吗? 有没有任何工具可以做到这一点或任何具有顺序的 vc++ 项目文件?

最佳答案

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

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

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

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

相反,我通过以可读形式呈现 nm 中的符号,让我很容易看到我的程序缺少什么 -

对于 C,我使用脚本(here 作为“externs”和“imports”)来检查从“.o”文件集合导出导入哪些符号。这些脚本使用 nm 的输出程序,显示给定的符号。

对于 C++,nm 中有一个选项“-C”,它显示符号的未损坏名称。

关于linux - 使用 gcc 查找要在项目中链接的 .o 文件顺序的任何工具,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28982683/

相关文章:

python - cv2.VideoCapture 帧速率的差异取决于初始化参数

visual-c++ - 关闭后从模态 MFC 对话框中获取编辑框文本

php - 尝试用 PHP 编译 C 代码

c - 如何使用 GNU C 预处理器预定义宏?

无法使结构在 C 中工作(使用 GCC)

linux - 是否可以使用 gcc 导出一组符号?

r - 在 Bash 中打印 R 脚本的输出

linux - 需要 bash time 命令的功能才能运行

c++ - Operator= 在 C++ 中重载

c++ - 如何获取和设置编辑框的 'read-only' 属性?