2

我正在使用 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 实际上为“Debug Information Format”提供了一个额外的“Disabled”选项,VC10 中并未出现该选项;这可以解释我的一些困惑。

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

4

1 回答 1

0

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

于 2013-03-24T03:05:05.950 回答