【问题标题】:Merge two Qt/C++ projects: redefinition errors合并两个 Qt/C++ 项目:重新定义错误
【发布时间】:2012-05-18 10:29:51
【问题描述】:

我在合并两个单独编译的项目时遇到了问题。 我创建了一些类(Qt 和 C++)来管理两个机械阶段(第一个项目)和一个用于激光扫描仪的类/接口(第二个项目)。 当我在第一个项目中导入类/接口时,编译器在某些 Windows api 类上给了我很多重定义错误(第二个项目使用类作为 winsock2)。

有人可以帮我找出我的错误吗?不仅是我的“语法”错误;)

谢谢!

【问题讨论】:

  • 你是否使用了一些 win api 头文件?在那种情况下,#include 顺序确实很重要:)
  • 在“stages 项目”中,我没有直接包含任何 Windows 头文件,但在“激光项目”中,我包含了激光 SDK 的两个头文件:第一个包含 winsock2.h 和第二个标头,按此顺序,包括windows.h。我在网站的另一个问题中读到,我必须在winsock2.h 之前包含windows.h。我试图更正标题,但项目没有编译。
  • 别问我为什么,我把winsock2.h从激光SDK的头部排除了。该项目已编译,现在可以正常工作。我不明白为什么,但它有效......
  • 在 C++ 世界中发生了奇怪的事情;)

标签: c++ qt4 redefinition


【解决方案1】:

只需clean 项目,重新构建并再次运行。发生这种情况的一种可能性是,您可能在任何项目中使用了以前版本的库,而现在在合并两个项目后,您可能正在其他项目中使用最新版本的库。您合并的项目已经存在的编译二进制文件将寻找不同版本的库,但您可能在第二个项目中包含了它的另一个版本,反之亦然!!合并后两者似乎在同一个项目中!因此,请尝试清理项目,仅使用最新版本的库并重新构建并运行。

如果您尝试同时包含winsock.hwinsock2.h,则肯定会发生此错误。因为winsock2.h 是对winsock.h 的完全重写。所以你肯定会得到重新定义错误。

一种可能的解决方案是..

  Try to include winsock2.h before you include the header file(s) which is 
  including winsock.h.That will do.

Try using only 1 version of it

【讨论】:

  • 我尝试清理和重建,但它不起作用。要“合并”项目,我只需将所有 .cpp、.h、.lib 和 .dll 文件放在项目的同一目录中。如果我“按原样”编译项目,编译器会构建项目,但(显然)它只运行主文件中调用的部分。如果我在正在运行的项目的源代码之一中包含(仅包含,我不创建任何对象)我的接口类,编译器会给我错误...我使用的库是 SDK 的原始库和 dll,我只有一个版本。
  • 好像两个项目都是独立工作的,而不是在合并的时候??您能否发布有关发生此重新定义错误的库的信息?还有一些错误?
  • 所有的错误都是这样的:...\include\winsock2.h:1701: error: C2375: 'getsockname': redefinition. Different link.或者这个...\include\winsock2.h:245: error: C2011: 'netent': redefinition type 'struct' C...\include\winsock.h(180): see declaration of 'netent'
  • 这就是问题所在,您同时包含了 winsock2.h 和 winsock.h。我已经编辑了我的答案,请查看。
  • 我以这种方式包含winsock2.h#ifndef _WINSOCKAPI_ #include <winsock2.h> #endif。现在项目编译。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多