作者whatai (多多)
看板LinuxDev
标题Fw: [问题] G++ 无法正常编译
时间Tue Feb 7 11:54:56 2017
※ [本文转录自 C_and_CPP 看板 #1Oc4I3eq ]
作者: whatai (多多) 看板: C_and_CPP
标题: [问题] G++ 无法正常编译
时间: Mon Feb 6 17:40:14 2017
再次更新
询问其他朋友 得到的答案是可能是ccache造成的
我在编译之前先使用ccache --clear 就可以正常报错了
(懒人包:遇到的问题是 "程式码有错 但是编译会成功")
但是也只有这一次是正常报错 将程式改回正常状态 编译成功後
再次加入错误的程式码还是会编译成功
看来只能每次编译前都加ccache --clear?
但是清除ccache後编译速度很慢
而且感觉有点在避问题 请问有谁知道该如何修正这问题的吗?
-----------------------------
新增影片
https://www.dropbox.com/s/oadtso6opxzdkbg/make_error.mov?dl=0
开发平台(Platform): (Ex: Win10, Linux, ...)
linux fedora16(32bit)
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
G++
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
none
问题(Question):
最近在开发专案时发现 我上的linux有机会发生不正常编译的问题
例如我今天写好程式 也编译"成功" 但是运行後发现这是旧版本
原本以为是没有clean造成的问题
但是clean之後再次编译 运行後还是旧版本
这时候我直接在.cpp档中直接加入垃圾
例如 nvjenhj rjhsnk hbrieh 等等无意义的字串
这时候编译理论上会回报错误
但是很神奇的她编译成功了 而且运行後发现还是旧版本
因为程式码的空间是mount上去的 原本以为会不会有什麽同步上的问题
但是用cross-compiler(例如arm-linux-XXX mipsel-linux-XXX ba-linux-XXX)
来编译每一个都是正常回报错误 拿掉垃圾後每个cross-compiler都是编译成功
编译出来版本也正常 因此目前我排除mount的问题以及程式码本身的问题
但加回垃圾用g++编译还是会编译成功(实际上应该要失败)
後来问题追到makefile / mk 档上
後来发现只要改一个地方就可以修正这问题
如下:
INCLUDE += -I$(SRC_DIR)
INCLUDE += -I$(SRC_DIR)/AAAA
INCLUDE += -I$(SRC_DIR)/BBBB
只要改成(如下)
INCLUDE += -I$(SRC_DIR)/
INCLUDE += -I$(SRC_DIR)/AAAA
INCLUDE += -I$(SRC_DIR)/BBBB
如上 只要多一个" / " 就可以解决
但是如果 多几个字元 例如 -I./$(SRC_DIR)/
可能又会发生一样的问题
问题有点难以形容 询问主管也说没遇过
但这问题我已经是第3次发生了 每次发生都是改mk档 直到可以正常报错为止
但是因为不同的cross-compiler是吃同一份mk档 因此mk档的写法应该也没有问题
(有另外的mk档负责cross-compiler设定)
不知道有没有哪位大大可以说明一下原因以及真正解法
毕竟这是一个不确定因素 哪时候会在遇到也不知道
ps. 没办法换linux 因为是公司内部的linux没办法说换就换
预期的正确结果(Expected Output):
编译错误(没错 我是要编译失败)
错误结果(Wrong Output):
编译成功
程式码(Code):(请善用置底文网页, 记得排版)
有需要可以提供完整的makefile/mk档 以及编译框架的说明(站内信提供)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 220.135.55.46
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1486374019.A.A34.html
1F:推 nick5130: 先make clean再make试试看 虽然治标但是写个shell就好了 02/06 21:24
2F:推 nick5130: 如果project太大 我就会去删掉编出来的so或a或o 02/06 21:28
3F:→ nick5130: 问题应该是g++并不知道你的档案有更动 所以不会重编 02/06 21:29
4F:→ nick5130: 治本的方法要看看版上有没有人可以提供了 XD 02/06 21:29
5F:→ descent: makefile 可能没写好, 不过你的 makefile 好像很复杂, 02/06 21:40
6F:→ descent: 可能不好查 02/06 21:40
7F:推 herman602: 你是在编译Android SDK? 02/06 21:55
不是 是公司内部的library 不过因为必须要可以跨平台
所以同一份code也可以编android/ios/windows
8F:推 Bencrie: 直接下 make -B 强迫重编译 02/06 22:25
9F:→ whatai: 後来改成每次编译前都有clean还是一样 -B等等到公司测测 02/07 09:42
10F:→ whatai: 看看 02/07 09:42
make -B试过了也没有用
拍了部影片 应该比较可以看得懂问题所在
https://www.dropbox.com/s/oadtso6opxzdkbg/make_error.mov?dl=0
一开始程式码中就已经加入垃圾
接着make clean再make >> 编译成功
修改相关mk档 make clean再make >> 编译成功
再次修改相关mk档 make clean再make >> 编译失败(这才是我要的结果)
问题点在於每次mk档修改位址都不一样 但理论上除非语法错误
否则加入垃圾的程式无论如何都应该编译失败
但是前两次却是编译成功的
这会造成我无法判断新的程式是否有真的被编译
而不是不知道哪个版本的程式
而且开发/维护过程中也许不小心语法错误可能也不会发现
问过其他人 是说有可能是环境变数造成的 但应该都是使用预设 没去动到
另外我在想g++实际上是不是有其他暂存区会存放编译出来的.o档
因此在某些情形下会读到旧的.o才导致这问题的??
还请其他好心的大爷们 救救我这可怜的小工程师阿 QAQ
※ 编辑: whatai (60.251.110.174), 02/07/2017 11:42:37
※ 发信站: 批踢踢实业坊(ptt.cc)
※ 转录者: whatai (60.251.110.174), 02/07/2017 11:54:56
※ 编辑: whatai (60.251.110.174), 02/07/2017 11:57:09
11F:推 longlongint: 有用到 hard link 吗 02/07 22:27
12F:→ whatai: 没有 02/08 00:17
※ 编辑: whatai (60.251.110.174), 02/08/2017 11:05:52
※ 编辑: whatai (60.251.110.174), 02/08/2017 11:06:11
※ 编辑: whatai (60.251.110.174), 02/08/2017 11:10:59
13F:→ fatrabitree: 系统时间有对吗? 会不会编辑时间比.o还早 02/08 23:10
14F:→ whatai: 这我有对过 没有问题 02/08 23:15