【问题标题】:How to disable incompatible type checks in CMakeLists.txt?如何在 CMakeLists.txt 中禁用不兼容的类型检查?
【发布时间】:2021-12-18 19:21:38
【问题描述】:

我正在将我当前的项目链接到一个编译良好的遗留 C++ 项目的库。

但是当我尝试在我当前的新项目中使用相同的旧项目的 API 时,它会在以下行抛出 error: asigning to uint32_t * (aka unsigned long *) from incompatible type unsigned int *

uint32_t *curval = static_cast<unsigned *>(storage_allocator_->ReserveUsingMalloc(getValSize());

我知道如果我在那个遗留项目中简单地将static_cast&lt;unsigned *&gt; 更改为static_cast&lt;uint32_t *&gt; ,上述错误将得到解决。

很遗憾,出于某些真正的考虑,我不能修改那个遗留项目。

那么,如何在我当前的 CMakeLists.txt 或任何其他选项中禁用此编译检查?

【问题讨论】:

  • unsigned int 不是必需的 32 位,它似乎根据您的项目而变化。选择目标 32 位而不是 64 位可能会解决您的问题。
  • 虽然long 可能是 32 位宽,但 uint32_t 基于long 是相当不寻常的。遗留项目是否自己定义了uint32_t 类型(例如typedef)?作为对这个问题以及如何解决它的猜测,也许遗留项目是为long 是 32 位的 32 位系统开发的,但现在你正在构建一个 long 是的 64 位系统64位宽?也许您应该要求编译器以 32 位模式构建?
  • 是的,我当前的项目正在构建 64 位
  • 假设您使用 GCC,在构建和链接时添加 -m32 标志。
  • @Someprogrammerdude 我正在使用 Clang 进行编译

标签: c++ cmake


【解决方案1】:

问题与cmake 无关。这是由无效的 C++ 代码引起的。 当您构建到具有特定位数(32/64 位)的平台时出现错误,cmets 中指出了什么。

这一行是代码异味:

uint32_t *curval = static_cast<unsigned *>(storage_allocator_->ReserveUsingMalloc(getValSize()));

为什么你对一种类型进行静态转换,然后对另一种类型进行分配?这应该是一致的,所以:

uint32_t *curval = static_cast<uint32_t *>(storage_allocator_->ReserveUsingMalloc(getValSize()));

unsigned *curval = static_cast<unsigned *>(storage_allocator_->ReserveUsingMalloc(getValSize()));

或使用auto

auto *curval = static_cast<uint32_t *>(storage_allocator_->ReserveUsingMalloc(getValSize()));

现在正确的解决方案取决于 storage_allocator_-&gt;ReserveUsingMalloc(getValSize()) 返回的类型(您没有提供该信息)。

【讨论】:

  • 我明白你的意思,但正如我所说,这个代码异味来自一个遗留项目,我不允许修改它,但需要使用它的一些 API。因此,最初的问题是,我如何才能库链接到该遗留模块而不会因为该检查而出现编译错误。
  • 只需提供缺失的信息(您提供的详细信息越多越好),我们就可以帮助您正确解决问题。
  • 只是为了清楚没有标志可以丢弃此错误。您只能更改架构或修复此代码。
猜你喜欢
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多