我正在移植 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/