可执行二进制文件为什么包含所包含头文件的路径?

14
编译和链接后的可执行文件为什么包含了我的源代码中包含的头文件路径?我正在使用wxWidgets库并使用Visual Studio 2013和gcc进行编译。这些头文件有什么用途?如果这是一个编译器选项,如何禁用它以避免此问题发生?
构建配置:release,静态链接。 Example

这些是库的路径,而不是头文件的路径。当编译/链接动态链接库时,代码需要知道库的位置。'静态'链接会使代码变得更大,但会删除那些不再需要的路径。 - user3629249
2个回答

15

这样的字符串出现在可执行文件中可能有几种解释:

  • 您可能已经在可执行文件中捆绑了调试信息供调试器使用。使用 strip 命令来删除它,或者不要使用 -g 编译选项。您还应该定义 NDEBUG 来禁用调试代码和断言。这通常是 Release 模式下的情况,但您可能需要再次确认。
  • 某些函数可能会使用 __FILE__ 进行跟踪或记录目的。 __FILE__ 在宏展开点扩展为源文件名,可以是源文件也可以是头文件。其中一个这样的函数是 assert():它实际上是一个将展开为测试和一些包含当前文件名的错误报告代码的宏。
  • 有些源代码可能会具有形式为 static char 数组的静态源 id,以跟踪源代码版本。这种方法已经相当过时,但许多旧的源代码仍然使用它们。

在可执行文件中出现名称的源文件或头文件中查找此类问题并予以修复。


一个单独的assert()可能是问题的原因(根据Charlie列表的前两项)。使用NDEBUG编译可以消除许多问题。 - Hagen von Eitzen
我已经尝试了strip和将wxDEBUG_LEVEL定义为0,但它们都没有起作用。 - Gokhan Bora
@Gokhan Bora:你重新编译了所有东西吗? - chqrlie
是的,重新编译了项目和wxWidgets库。在定义wxDEBUG_LEVEL之后,二进制文件中的字符串变少了。但是仍然有很多可读的字符串在exe文件中。谢谢你的帮助。 - Gokhan Bora
这些字符串是文件名吗?如果是,问题就在于可执行文件中找到的每个文件的名称。 - chqrlie
1
屏幕截图中显示的字符串明显来自于断言消息,如果wxDEBUG_LEVEL设置为0,则不应存在这些字符串。要找出其余字符串的来源,您需要将它们展示给我们。 - VZ.

6

wxWidgets的头文件中有许多断言(例如在中),所有这些都使用中定义的wxASSERT宏。

为了禁用这些断言,您可以在包含任何wxWidgets头文件之前#define wxDEBUG_LEVEL 0


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接