使用 C++ - C++/CLI - C# 项目(Borland 和 VS 特定组件)构建问题

Posted

技术标签:

【中文标题】使用 C++ - C++/CLI - C# 项目(Borland 和 VS 特定组件)构建问题【英文标题】:Build issues with a C++ - C++/CLI - C# project (Borland and VS-specific components) 【发布时间】:2010-08-09 10:36:17 【问题描述】:

堆栈溢出!

今天的问题有点奇怪,请多多包涵。任何意见/建议都非常感谢!

我在一个项目中继承了一个旧代码库,其中的一些组件可以追溯到 2002 年。这个项目根本没有任何文档,并且设置构建的原始机器不再存在(硬盘驱动器失败并且没有可用的备份...)。该系统与机械臂交互并控制机械臂。我有一个完整的安装和安装在具有适当硬件的测试机器上的可执行文件。源代码位于 Subversion 存储库中,但日志消息很少,没有提供任何实用建议。它最近在 1 月份进行了研究,但开发人员在我开始之前就离开了。它使用基于 C# 的新 GUI 进行了部分重写。该项目由 C++、C++/CLI 和 C# 组成。它使用Boost和VTK。 简而言之,我的问题是:软件的控制部分存在一个对客户端至关重要的错误,我无法构建项目。没有可用的调试符号并且附加正在运行的 exe 不起作用(可能的原因如下)。既不是 C# 在我尝试过的任何配置下,版本或最新的源代码构建。

为了使事情进一步复杂化,有人建议 - 尽管我对此不确定 - 该项目过去是通过 Borland C++ Builder V6 构建的,并且已经迁移到 Visual Studio。它仍然包含 Borland 特定的组件,尽管 其中大部分似乎是有条件的。

我的经理发誓它将不会在 VS 下构建,并且必须在 Borland 中完全编译。问题是我不能让它在没有几十个错误的情况下构建。肯定有 Borland 特定的组件(BPL 文件),但我不知道它们是什么 或者它们与项目结构的关系。

我想知道它是否需要在 Borland 和 VS 中构建,或者类似的东西。所以,我的问题是:有什么方法可以尝试推断如何构建这个东西,还是只是尝试所有选项直到我找到正确的选项?

编辑:错误日志如下。请注意:我对 VS 很熟悉,但直到几天前我才使用过 Borland。菜鸟警报!

Borland C++ Builder 6 请求了几个 .bpi 文件,但这些文件丢失了(相应的 .bpl 文件可从测试机器上的安装中获得)。

执行预构建批处理文件似乎执行没有错误。

我已经下载了 C++ Builder 2010 的试用版,并将项目导入其中。在似乎是 正确的目标我得到以下错误(在一些提示丢失文件之后......我试图设置链接器和编译 避免这些的选项,但老实说,我不知道这些是外部依赖还是没有的 Borland 组件 已安装)

正在检查项目依赖项... 构建 LoggingDebug.cbproj(调试配置)

[BCC32 错误] is_array.hpp(40): E2430 重新声明'is_array'时模板参数的数量不匹配

[BCC32 错误] is_array.hpp(40): E2428 模板必须是类或函数

[BCC32 错误] is_array.hpp(41): E2430 重新声明'is_array'时模板参数的数量不匹配

[BCC32 错误] is_array.hpp(41): E2428 模板必须是类或函数

[BCC32 错误] is_array.hpp(42): E2430 重新声明'is_array'时模板参数的数量不匹配

[BCC32 错误] is_array.hpp(42): E2428 模板必须是类或函数

[BCC32 错误] is_array.hpp(43): E2430 重新声明“is_array”时模板参数的数量不匹配

[BCC32 错误] is_array.hpp(43): E2428 模板必须是类或函数

[BCC32 错误] ct_if.hpp(31): E2238 'ct_and::type' 的多重声明

[BCC32 错误] ct_if.hpp(30): E2344 'ct_and::type' 的早期声明

[BCC32 错误] function_base.hpp(157): E2238 'function_return_type::type' 的多重声明

[BCC32 错误] function_base.hpp(152): E2344 'function_return_type::type' 的早期声明

[BCC32 错误] alignment_of.hpp(37): E2468 Value of type void is not allowed

[BCC32 错误]alignment_of.hpp(56):E2450 未定义结构 'alignment_of_hack'

[BCC32 错误] alignment_of.hpp(56): E2109 Not an allowed type

[BCC32 错误] alignment_of.hpp(37): E2468 Value of type void is not allowed

[BCC32 错误]alignment_of.hpp(56):E2450 未定义结构 'alignment_of_hack'

[BCC32 错误] alignment_of.hpp(56): E2109 Not an allowed type

[BCC32 错误] alignment_of.hpp(37): E2468 Value of type void is not allowed

[BCC32 错误]alignment_of.hpp(56):E2450 未定义结构 'alignment_of_hack'

[BCC32 错误] alignment_of.hpp(56): E2109 Not an allowed type

[BCC32 错误] alignment_of.hpp(37): E2468 Value of type void is not allowed

[BCC32 错误]alignment_of.hpp(56):E2450 未定义结构 'alignment_of_hack'

[BCC32 错误] alignment_of.hpp(56): E2109 Not an allowed type

[BCC32 错误] if.hpp(131): E2270 > 预期

[BCC32 错误] if.hpp(131): E2321 声明未指定标签或标识符

[BCC32 错误] type_with_alignment.hpp(271): E2238 'type_with_alignment::type' 的多重声明

[BCC32 错误] type_with_alignment.hpp(268): E2344 'type_with_alignment::type' 的早期声明

[BCC32 错误] not.hpp(40): E2015 Ambiguity between 'aux' 和 'mpl_::aux'

[BCC32 错误] not.hpp(47): E2270 > 预期

[BCC32 错误] not.hpp(47): E2321 声明未指定标签或标识符

[BCC32 错误] void.hpp(71): E2270 > 预期

[BCC32 错误] void.hpp(71): E2321 声明未指定标签或标识符

[BCC32 错误] void.hpp(72): E2270 > 预期

[BCC32 错误] void.hpp(72): E2321 声明未指定标签或标识符

[BCC32 错误] or.hpp(50): E2015 'aux' 和 'mpl_::aux' 之间的歧义

[BCC32 错误] or.hpp(62): E2270 > 预期

[BCC32 错误] or.hpp(62): E2321 声明未指定标签或标识符

[BCC32 错误] eval_if.hpp(67): E2270 > 预期

[BCC32 错误] eval_if.hpp(67): E2321 声明未指定标签或标识符

[BCC32 错误] identity.hpp(40): E2270 > 预期

[BCC32 错误] identity.hpp(40): E2321 声明未指定标签或标识符

[BCC32 错误] identity.hpp(41): E2270 > 预期

[BCC32 错误] identity.hpp(41): E2321 声明未指定标签或标识符

[BCC32 错误] yes_no.hpp(35): E2238 'yes_no_tag::type' 的多重声明

[BCC32 错误] yes_no.hpp(30): E2344 'yes_no_tag::type' 的早期声明

[BCC32 错误] assert.hpp(79): E2270 > 预期

[BCC32 错误] assert.hpp(79): E2321 声明未指定标签或标识符

[BCC32 错误] arg.hpp(21): E2270 > 预期

[BCC32 错误] arg.hpp(28): E2321 声明未指定标签或标识符

[BCC32 错误] arg.hpp(28): E2228 错误或警告消息过多

失败

经过时间:00:00:36.2

确切的错误取决于我从存储库中提取的源版本,但考虑到这个东西显然是“在正确的条件下”完美构建的,大量错误肯定意味着外部依赖项、项目设置等问题。

【问题讨论】:

如果您向我们提供编译器错误日志,我们或许可以帮助您找出问题所在。 @Merlyn:谢谢,这是一个很好的建议。我会提供更多信息:-) 【参考方案1】:

但开发人员在我开始之前就离开了

硬盘出现故障,没有可用的备份

如果没有几十个错误,我都无法构建它。

这上面写满了软件项目灾难。您可能是在最后一次尝试通过向问题扔肉来挽救投资时被雇用的。你就是肉即使最初的开发者放弃了它,你也能拯救它的几率非常低。

您需要得到管理团队的承诺,才能有机会圆满结束。坚持以下几点:

他们应该以高得离谱的咨询费聘请至少一名最初的首席工程师,经过校准,不!不是一种选择。 他们应该聘请数据恢复公司从故障磁盘中获取信息 他们应该购买所有用于构建产品的原始工具。如果供应商不再提供它们,请查看拍卖网站,例如 ebay。 不要在试用版上浪费您的时间。

如果您发现他们在执行这些步骤时有任何犹豫,请滚开。

【讨论】:

感谢您的健全性检查,汉斯。这里的所有项目都是相似的:没有文档,开发人员放弃并离开,未完成并充满错误和不良做法。甚至存储库也是乱码。幸运的是,我也很快就要离开了,但我确实希望在去之前尝试(稍微)整理一下。不管怎样,很高兴听到不仅仅是我想知道我是不是在鼹鼠山上造山!【参考方案2】:

当我将项目从 Borland 2006 移动到 Borland XE 时,我遇到了类似的错误。解决方案是,我的代码包含来自 boost_1_34 的文件。我从项目中删除了包含路径,并使用了与新 IDE 一起提供的 boost 库。程序编译成功

【讨论】:

以上是关于使用 C++ - C++/CLI - C# 项目(Borland 和 VS 特定组件)构建问题的主要内容,如果未能解决你的问题,请参考以下文章

C++/CLI + C++ Native 会提高性能吗? [关闭]

使用 C++/CLI 包装器将二维数组从 C# 传递到非托管 C++

C# 使用 CLI 包装器调用非托管 C++

非托管C++通过C++/CLI包装调用C# DLL

是否可以在 C# 中从本机 C++ 类创建变量?

为啥我们不能将本地 C++ 的引用传递给 C++/CLI?