合并 c++ obj 文件以进行 C 链接

Posted

技术标签:

【中文标题】合并 c++ obj 文件以进行 C 链接【英文标题】:Merge c++ obj files for C linking 【发布时间】:2017-03-23 14:14:55 【问题描述】:

我有一个庞大的 C/Pro*C 项目想要改进。我复制了一段,用 C++ 重写,它编译并运行良好。

我现在想将它包含到我的 C 项目中。为此,我想将我所有的小 obj 文件合并为一个,然后在最终链接期间将其与其他 obj 文件一起添加。

但是,我遇到了错误,需要帮助。

我尝试了ld -Ur file1.o file2.o -llib1 -llib2 -o feature.o,但 ld 抱怨它找不到我的库(没有一个) 我尝试了ld -Ur file1.o file2.o -o feature.o,但后来 ld 抱怨说有大量未定义的对各种 STL 元素的引用。 我尝试了g++ file1.o file2.o -llib1 -llib2 -o feature.o,但它抱怨它找不到 main(),这是完全正常的,因为我不希望他制作可执行文件 我试过g++ file1.o file2.o main.o -llib1 -llib2 -o feature,它编译得非常好,但这不是我想要的...... 我试过g++ -Xlinker -Ur file1.o file2.o -o feature.o so that g++ would give automagically the stl links to ld, but again, ld could not find the STL...

请问我该怎么办?

编辑: 我希望尽可能少更改的主 makefile 包含二进制文件列表及其关联的 obj 文件。我希望将我的 obj 文件添加到这些列表之一,以便最终链接是透明的。

EDIT2:我不想创建一个库。我的新代码将替换旧代码,我想逐个模块地使用相同的过程。

【问题讨论】:

不确定你到底想要什么。您可以尝试使用 ar 使用您的目标文件创建一个静态库。 即使你获得了成功的合并,你仍然需要使用 g++ 进行链接。 听起来您正在尝试构建一个库?网上有很多资源可以帮助你做到这一点。 谨防名称篡改。许多 C++ 编译器根据函数的参数和返回类型为函数创建新名称。 嗯...,您真的应该尝试显示minimal reproducible example。举个简单的例子,ld -Ur file1.o file2.o -o feature.o 后跟 c++ main.o feature.o -o foo 实际上会生成一个 foo 可执行文件。 【参考方案1】:

要将目标文件合并到静态库中,您应该使用ar

【讨论】:

以上是关于合并 c++ obj 文件以进行 C 链接的主要内容,如果未能解决你的问题,请参考以下文章

在 Qt 中链接 obj 文件

VS2005链接过程中合并元数据时忽略文件

链接错误2005 Visual Studio 2008 C++

C++程序文件链接

尽管链接到带有导​​出符号的 .lib 文件,但从托管 C++ 链接到非托管 C++ 时出现链接错误

C++中const使用注意要点