2013-03-22 154 views
2

我已经在这一款上搜索了我的裤子,同时我发现了很多类似的问题,因为似乎没有解决我遇到的具体问题。将调试版本链接到版本库:警告LNK4204

我使用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,那肯定会发生什么?我无法相信我以前从未发现过这个问题,这似乎很明显(你能否告诉我很恼火!)。在人们说出来之前,我真的不想发布带有调试信息的版本库,因为我想尽量减少逆向工程的风险。我知道有些人会说,当用户发现bug并且没有pdb信息时,你会后悔的,但是当我说我不关心这个时,请相信我。

所有帮助赞赏(和apols如果这是一个重复,但我真的无法找到一个相同的问题)。

干杯, 安德鲁

UPDATE:

我相信我已经解决问题了,但我不完全知道为什么它的工作原理。绝对需要进一步研究这一点。但总之,我可以(并且实际上需要)用VC9构建。请注意,VC9实际上为“调试信息格式”提供了一个额外的“禁用”选项,该选项不会出现在VC10中;这可能解释我的一些混乱。

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

+0

你应该能够禁用调试信息[像这样](http://stackoverflow.com/questions/14505322/disable-c-pdb-generation-from-the-ide)。 – 2013-03-22 21:16:32

+0

这恐怕不适合我。我在创建库时试图关闭它,所以我没有“生成调试信息”选项。我不想在用户应用程序中关闭该选项。此外,调试信息格式在删除时会恢复为默认值。 – 2013-04-06 12:17:57

回答

0

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