gcc编译报错解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Gcc最基本的用法是∶
gcc [options] [filenames] 其中options就是编译器所需要的参数,filenames给出相关的文件名称。
-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件。
-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。
1.linker input file unused because linking not done
我在Windows下使用SQLite编了个C++程序,在编写Makefile并使用cygwin 中的g++进行编译链接时遇到如下的错误:
linker input file unused because linking not done
我的语句是g++ -c a.cpp -lsqlite3
到网上查了一下,问题出在链接数据库的语句不应出现在编译语句里面。上面的语句里面有-c 即编译compile,所以命令会忽略掉所有的-l 链接库的命令。
而要链接数据库,应该在生成可执行文件时才使用。
正确的使用链接的语句应该是g++ a.o -L. -lsqlite3 -o exename
2.Linux系统的头文件和库文件搜索路径
**#include**的头文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。
∙当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()
∙写在specs内的(针对rpm包)
∙后来用-D -I -L指定的
∙gcc环境变量设定(编译的时候)
∙ld.so的环境变量(这是run time的时候)
头文件
gcc 在编译时如何去寻找所需要的头文件:
∙header file的搜寻会从-I开始
∙然后找gcc的环境变量C_INCLUDE_PA TH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PA TH
∙再找内定目录:
o/usr/include
o/usr/local/include
o/usr/lib/gcc-lib/i386-linux/2.95.2/include
o/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
o/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include
∙库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是
o/usr/include
o prefix/include
o prefix/xxx-xxx-xxx-gnulibc/include
o prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include
库文件
cos()等函式库的选项要多加-lm
∙编译的时候:gcc会去找-L
∙再找gcc的环境变量LIBRARY_PATH
∙再找内定目录/lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的
运行时动态库的搜索路径
1 在配置文件/etc/ld.so.conf中指定动态库搜索路径
2 通过环境变量LD_LIBRARY_PA TH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
3 在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
4 默认的动态库搜索路径/lib
5 默认的动态库搜索路径/usr/lib
动态库的搜索路径搜索的先后顺序是:
1 编译目标代码时指定的动态库搜索路径;
2 环境变量LD_LIBRARY_PA TH指定的动态库搜索路径;
3 配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4 默认的动态库搜索路径/lib;
5 默认的动态库搜索路径/usr/lib。