链接器 - 模块机器类型冲突

时间:2016-02-02 15:33:06

标签: c++ c dll linker poco

我正在尝试在使用V​​isual Studio 2008的现有Windows CE解决方案中使用C ++ POCO库。该解决方案包含Wi​​ndows Forms C#项目和C / C ++本机DLL。

我使用提供的.bat构建脚本构建了POCO .lib文件,将它们添加到我的DLL项目中,所有内容编译都很好,除了我无法链接:

  int[] source = { 1, 2, 3, 4, 3, 5, 1, 1};

  var result = source.Select((item, index) => new {
    item = item,
    index = index
  })
  .GroupBy(v => v.item, v => v)
  .Where(chunk => chunk.Count() >= 2)
  .OrderBy(chunk => chunk.Key)
  .Select(chunk => String.Format("item {0} appears at {1} positions", 
     chunk.Key, 
     String.Join(", ", chunk.Select(v => v.index))));

  String report = String.Join(Environment.NewLine, result);

  // item 1 appears at 0, 6, 7 positions
  // item 3 appears at 2, 4 positions
  Console.Write(report);

我的项目的模块机器类型设置为:“未设置”。

我不明白这是由于什么原因造成的。这可能与POCO .lib文件的编译方式有关吗?当我将POCO .lib文件嵌入到静态编译中时,我也不明白为什么错误消息说:PocoFoundationd.lib(PocoFoundationd.dll) : fatal error LNK1112: module machine type 'X86' conflicts with target machine type 'THUMB' ,即我没有为POCO库使用DLL。只有DLL是我想要链接的那个。

我对C / C ++代码下面发生的事情知之甚少,但不是机器独立的.lib文件中包含的代码吗?

编辑:如果我在我的项目中将机器类型设置为ARM,那么冲突就会消失,但我会在Windows API库中找到一个新的:

PocoFoundationd.lib(PocoFoundationd.dll)

1 个答案:

答案 0 :(得分:0)

好吧,我设法让它发挥作用。

我可以打开最初随库提供的Visual Studio项目,并使用正确的目标机器类型重新编译.lib文件。

最初我不能这样做,因为我没有在我的开发机器上安装解决方案使用的唯一SDK,但他们在网站上解释说,必须手动编辑项目和解决方案文件以替换默认平台名称由要使用的名称。

所以最后,所提供项目的DLL配置必须使用正确的目标机器类型进行编译,即使未使用DLL ,也可以链接.lib在最后的项目中。