0

我有一个使用本机 C++ 以及 C++/CLI 构建的项目。我有以下组件:

程序集 A (C++/CLI)
 | 用途
程序集 B (C++/CLI)
 | 用途
静态库 C(本机 C++)

我对 Static Lib C 进行了重大重写,它可以编译,其他使用它的本地项目也可以正常编译。程序集 B 在重写过程中没有任何变化 - 正如预期的那样,当我编译程序集 B 时,它编译得很好,没有错误或警告。但是,当我尝试编译程序集 A 时,找不到任何应该在程序集 B 中可用的符号,从而导致数百个错误。我尝试在 A 项目中添加和删除 B 和 C 作为引用,但没有成功。我试着做一个干净的,并从头开始重建一切 - 但仍然没有运气。我在 RedGate 的 Reflector 中加载了 Assembly B,但我看不到符号,所以至少这是一致的。我在一个分支上工作,所以我从主干加载了一个早期版本的程序集 B,(它要求卸载我从分支加载的早期版本),我可以看到里面的所有符号。因此,当我在 Reflector 中查看当前版本的 Assembly B 时,我看到:

+TFModelSetNETD,版本=1.0.3532.42171,文化=中性,PublicKeyToken=null
  +TFModelSetNETD.dll
    + 参考文献
      + {} -
      + <CppImplementationDetails>
      + <CrtImplementationDetails>
      + vc_attributes

仅此而已。在旧版本中,我看到这四个条目,加上我在程序集 B、静态库 C、其他库中声明的所有命名空间,以及几个 boost 和 std 命名空间。我应该提到这是在 Visual Studio 2008 中。

关于这里发生了什么的任何想法?我只是无法理解我可以做些什么来使编译器不导出任何符号,而不给我任何警告。

想法、提示或调试建议都非常感谢。

编辑:我已将静态库 C 加载到 LibDump 中,并且所有符号都在那里 - 但是,在使用 Redgate Reflector 检查时,在程序集 B 中定义或从静态库 C 引用的符号均不可见。

4

1 回答 1

0

所发生的事情是相关符号的头文件从未包含在任何地方的 cpp 文件中。我对它为什么起作用的唯一解释是,其他编译单元之一可能间接包含有问题的标头,但是当它在重写中发生更改时,符号不再包含在任何地方。信不信由你,与我遇到的下一个问题相比,这个问题很容易 - boost::thread 由于与 DLL 初始化和线程本地存储相关的冲突,导致程序集在加载时抛出异常。

于 2009-10-08T03:05:43.970 回答