【问题标题】:Linking a debug build to release library: Warning LNK4204将调试版本链接到发布库:警告 LNK4204
【发布时间】:2013-03-12 17:16:12
【问题描述】:

我使用的是 VC10(但我想这适用于 VC9、VC10 和 VC11)。简而言之,我想编译一个发布库,发布它并允许用户在制作他们的应用程序的调试或发布版本时能够链接到该库。烦人的是我不断收到 LNK4204 错误,例如:

mylib.lib(an_object_in_my_lib.obj) : warning LNK4204: '[PATH TO USER APPLICATION INTERMEDIATE DIRECTORY]\vc100.pdb' is missing debugging information for referencing module; linking object as if no debug info

很好。我明白这是在说什么。我最初的反应是“好吧,关掉它会很简单”。但是我找不到阻止这种情况的方法。让我吃惊的是:

  1. 我在库项目设置中找不到任何选项可以在没有调试信息的情况下进行编译(即使在发行版中!) - 上帝,我可以发誓有办法!
  2. 我在用户应用程序项目设置中找不到任何选项来指示链接器我知道没有调试信息,它应该继续执行它所告诉的操作!

有什么好的解决办法吗?据推测,想要链接到没有调试信息的库但为我正在创建的二进制文件生成调试信息的情况并不少见?链接到内核库和 crts 怎么样,肯定会发生这种情况吗?我不敢相信我以前从未发现过这个问题,这似乎很明显(你能说我很生气吗!)。

仅供参考,在人们说之前,我真的不想发布带有调试信息的发布库,因为我想将逆向工程的风险降到最低。我知道有些人会说当用户遇到错误并且您没有 pdb 信息时您会后悔,但是当我说我不在乎时请相信我。

更新:

我相信我已经解决了这个问题,但我不完全确定它为什么会起作用。肯定需要再研究一下。但简而言之,我可以(实际上需要)使用 VC9 构建。请注意,VC9 实际上为“调试信息格式”提供了额外的“禁用”选项,VC10 中没有出现该选项;这可以解释我的一些困惑。

现在“解决方案”似乎是创建库的调试版本(我很好),但保持调试信息“禁用”。当我这样做时,我没有任何抱怨。这很奇怪,因为在这两种情况下都没有调试信息(将调试链接到发布和调试到调试的情况),但是当链接到调试库时,我没有收到任何警告。到目前为止,这有点神秘。如果我有时间,我会进一步调查。也许我错过了什么!

【问题讨论】:

  • 你应该可以禁用调试信息like this
  • 恐怕这对我不起作用。我试图在创建库时将其关闭,所以我没有“生成调试信息”选项。而且我不想在用户应用程序上关闭该选项。此外,调试信息格式在删除后会恢复为默认值。

标签: visual-studio debug-symbols linker-warning


【解决方案1】:

防止警告的唯一方法是提供符号信息。如果你很聪明,你可能能够提供足够的符号信息来满足链接器的要求,但不足以提高你想象中的风险,使你的代码更容易进行逆向工程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2013-07-25
    • 2010-10-27
    相关资源
    最近更新 更多