C++ 如何从g++;表示到源标头的绝对路径的字符串

C++ 如何从g++;表示到源标头的绝对路径的字符串,c++,gcc,C++,Gcc,通过运行strings我注意到由我的g++4.7.3编译器生成的目标代码(不打开调试标志)包含到源代码单元中使用的所有头的绝对路径。对目标代码执行strip-s,不会删除这些字符串。为什么它们首先包含在目标代码中?其次,如何从目标代码中删除它们?文件名和路径通常来自命令行,因此如果使用绝对路径编译文件,它将显示在二进制文件中。您需要修改编译源文件的方式,可能需要更改生成系统。更改: g++ -I/home/frey/mylib/include /home/frey/foo.cpp -o foo

通过运行
strings
我注意到由我的
g++4.7.3
编译器生成的目标代码(不打开调试标志)包含到源代码单元中使用的所有头的绝对路径。对目标代码执行
strip-s
,不会删除这些字符串。为什么它们首先包含在目标代码中?其次,如何从目标代码中删除它们?

文件名和路径通常来自命令行,因此如果使用绝对路径编译文件,它将显示在二进制文件中。您需要修改编译源文件的方式,可能需要更改生成系统。更改:

g++ -I/home/frey/mylib/include /home/frey/foo.cpp -o foo


您的程序中是否有断言?
assert
宏经常会扩展为包含
\uuuuuuuuuuuuuuuuuuuuu
的内容。我会检查一下,但我认为我没有为生产启用任何assert或
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu文件>/code>尝试使用@JamesKanze编译。@Martin。可以通过定义
BOOST\u DISABLE\u断言来禁用它们(g++命令行上的
-DBOOST\u DISABLE\u断言)。这对于调试符号可能是正确的,但是如果
strip
没有删除它们,那么它就在程序的数据部分的某个地方,编译器不会为了好玩而在那里嵌入文件名。如果说在运行
条带之后,文件名仍保留在可执行文件中,那是很不可能的,因为OP使用绝对路径进行编译。@zneak这不是很可能的,因为我在公司维护了几年我们项目的构建系统。包含路径的符号/字符串出现的原因有多种,例如
-rdynamic
,而
条带
不会删除这些符号/字符串。另请参阅“关于完全删除源文件名”。@zneak这也会影响
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,你的意思是说一个好的
strip
实现应该知道什么字符串是
\uuuuu文件\uuuuuu
的产物,这样它就可以删除它吗?@zneak否。
strip
的实现不能删除任何被引用的字符串,通常,如果你使用了
\uu文件\uuuuuu
,它会被引用。我说的是在
\uuuu文件中包含路径(我似乎无法与您上面所写的内容建立联系,我可能在想其他事情)。
cd /home/frey
g++ -Imylib/include foo.cpp -o foo