我正在移植vc ++项目以在Linux平台上工作我使用g ++作为我的编译器。我解决了在g ++上编译问题并能够为vc ++项目中的每个源文件生成.o文件现在我必须将它们链接起来以生成最终的可执行文件
我能做到这一点g ++ file1.o file2.o -o file.out
但是当我在我的make文件中执行此操作并执行它时,很多ld错误正在接受dueto依赖&#39>
有什么方法可以说明给出目标文件的顺序? 是否有任何工具可以执行此操作或任何具有该命令的vc ++项目文件?
答案 0 :(得分:0)
你说" 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""导入")来检查哪些符号是导出的或从" .o"的集合中导入文件。脚本使用nm程序的输出,该程序显示给定的符号。
对于C ++,有一个选项" -C" nm表示符号的无名字。