Sunday, September 13, 2009

GCC configureation

gcc App.o -o App -L/usr/local/lib -L/usr/lib -L/usr/lib64 -DNO_SDL_MAIN -lz -lzip -lzipd -ldl -lX11 -lXext -lpthread -lGLU -lGL -ljpeg -lpng -lavformat -lavcodec -lavutil -lavdevice -lSDL -lG3D -lGLG3D -lG3Dd -lGLG3Dd -lm

这是GCC编译G3D例子starter的输入!看上去确实吓人,在刚接触GCC的时候,这个东西几乎让我疯狂了!在抓狂了一周后,今天凌晨终于解决了编译和链接的问题!现在谈谈这两天的感觉。希望抛砖引玉!
1. Linux下的library 和header都是搜索式的,比如有两个路径,/usr/local/lib和/lib,里面分别有一个叫G3D的header,当你使用linux下的编译器时,比如gcc,他会先搜索一个路径,在搜索另一个路径,先到先的,这个顺序是取决于你的输入顺序或设置的,一些新安装的库可能需要你对输入做一定的排序才能正确使用。G3D的安装过程中,我就犯了一个这样的错误,/usr/local/lib首先搜索,其下的libzipd.a没有更新,所以不管我怎么修改配置,重新编译,更换版本都无济于事,最后的解决办法很简单,要么删除/usr/local/lib下的库或者将新编译的库文件设置到较高的搜索优先级。Windows下就相对简单了,他们是登记式的,或者是更细化的搜索,你只要在注册表,环境变量或编译器中登记要使用的类库,虽然这个过程linux也有,但windows是没有固定的/lib和/include目录的,就是没有默认搜索,所以windows这个过程更直观一些。
2.“Undefined reference to .......” in link step. 这个问题通常因为library没有找到,比如你安装library的路径没有被编译器搜索,而include却被搜索到了,所以就出现了编译成功而链接出错!这里更需要注意的是gcc与window的错误信息是有区别的,在windows上,undefind refernce 肯定出现在编译阶段,链接阶段会说undefind symbol...如果你习惯了vc的错误信息,很容易把gcc link的错误当作编译的错误,所以不管你怎么改,都是不会有效的......
3.gcc的库是搜索式的,所以你不需要定义库的位置,只需要定义库的名字,如果你的安装路径不是默认的,你还需要设定一个搜索路径,gcc会一个接一个的搜索,当然,这里也会有谁先谁后的问题!library的命名方式是lib开头,然后是库的名字,最后的后缀是lib。gcc输入这是-l开头,紧跟着是lib的名字。比如,我向gcc传入 -lG3D, 在../lib中,他应该叫做libG3D.lib。最后用-lm表示library输入结束,而且要在最后!-L说明搜索的路径,FIFS!

No comments:

Post a Comment