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_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH
再内定目录 :
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
gnu编译器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/f中指定动态库搜索路径
2 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)
3 在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。这是通过gcc 的参数 "-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间用冒号":"分隔)
4 默认的动态库搜索路径/lib
5 默认的动态库搜索路径/usr/lib
动态库的搜索路径搜索的先后顺序是:
1 编译目标代码时指定的动态库搜索路径;
2 环境变量LD_LIBRARY_PATH指定的动态库搜索路径;
3 配置文件/etc/f中指定的动态库搜索路径;
4 默认的动态库搜索路径/lib;
5 默认的动态库搜索路径/usr/lib。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。