我刚刚从ubuntu 13.04升级到13.10(32位)
这已经升级了gcc和ld
版本号现在是:
gcc 4.8.1
ld 2.23.52.20130913
我之前使用的13.04版本是:
gcc 4.7.3
ld 2.23.2
在更新之前,我能够构建C项目的调试版和发行版。然而,对于新的gcc和ld,我得到了奇怪的行为,当构建相同的C项目时,包括gcc -O2优化设置导致后续链接错误,抱怨无法找到数学库函数,fmin, fmax,ceil,pow等。
makefile的输出如下所示:
ben@esroe-5:~/projects/oskar/tomek/core_harness/src$ make
gcc -g -Wall -DDEBUG=1 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src oskar_harness.c -c -o ../build/linux/debug/oskar_harness.o
gcc -g -Wall -DDEBUG=1 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src ../build/linux/debug/oskar_harness.o -L/home/ben/projects/oskar/tomek/core/src -L/home/ben/projects/oskar/tomek/core/build/linux/debug -L/home/ben/projects/oskar/tomek/core/build/linux/release -lOskar_dbg -lm -lrt -o ../build/linux/debug/OskarHarness_dbg
gcc -pg -O2 -Wall -DDEBUG=0 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src oskar_harness.c -c -o ../build/linux/release/oskar_harness.o
gcc -pg -O2 -Wall -DDEBUG=0 -I/home/ben/projects/oskar/tomek/core/src -I/home/ben/projects/oskar/tomek/pulse_IO/src -I/home/ben/projects/oskar/g2/src ../build/linux/release/oskar_harness.o -L/home/ben/projects/oskar/tomek/core/src -L/home/ben/projects/oskar/tomek/core/build/linux/debug -L/home/ben/projects/oskar/tomek/core/build/linux/release -lOskar_rel -lm -lrt -o ../build/linux/release/OskarHarness_rel
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `ceil'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmod'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmin'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `exp'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `fmax'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `log'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `pow'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `sqrt'
/home/ben/projects/oskar/tomek/core/build/linux/release/libOskar_rel.so: undefined reference to `floor'
collect2: error: ld returned 1 exit status
make: *** [OskarHarness_rel] Error 1
该项目只有一个与共享库链接的.c文件(它实际上是一个“利用”以允许使用共享库提供的API) - 您可以看到调试版本正在管理链接确定,而发布版本导致链接器吐出有关数学库的错误
我已经确定了使用-O2标志的错误,如果将其从gcc调用中删除以编译.o文件的发布版本,那么链接错误就会消失
我不确定这里发生了什么,我已经看过-O2和非-O2 .o文件的nm
输出,但它没有让它更清晰
有没有理由设置-O2优化标志应该以任何方式影响链接器查找数学lib函数的能力,如上面列出的makefile输出片段所示?