Linux 下编译链接动静态库
2010 年 03 月 29 日 星期一 17:11
Linux 版本是 Red Hat 9 , 内核版本是 2.4.18
输入 which gcc 查看 gcc 的位置在 /usr/bin/gcc
gcc -v 查看 gcc 编译前的配置信息
--prefix=/usr 说明了安装目录
没有 --with-headers 说明默认的 include 就在安装目录下
所以 gcc 默认的 include 目录是 /usr/include , 要包含另一个目录 ,
可以用 -I dir 选项包含该目录 , 想要更方便的可以
在 /etc/profile 中添加一个环境变量 C_INCLUDE_PATH
C_INCLUDE_PATH="your include path"
export C_INCLUDE_PATH
gcc 默认的 lib 目录很多 , 一般是 /lib 和 /usr/lib
可以输入 gcc -print-search-dirs 查看
同样可以在编译时通过 -L dir 来添加 , 也可以在 /etc/profile 中添加
LD_LIBRARY_PATH="your ldlib path"
export LD_LIBRARY_PATH
还有就是可以 /etc/ld.so.conf 中添加目录 , 这对于安装别的库很方便
当然修改了库文件后需要运行一下 ldconfig
自己制作交叉编译工具太复杂了 , 直接下一个 arm-linux-gcc-3.4.1.tar.bz2
tar jxvf arm-linux-gcc-3.4.1.tar.bz2 -C / 解压缩到根目录下
其实由于压缩包带的目录是 usr/local/arm/3.4.1
所以实际还是在 /usr/local/arm/3.4.1 目录下
在 bin 中可以看到各个工具 arm-linux-gcc ...
输入 ./arm-linux-gcc -v 可以看到配置信息
有 --with-headers=/usr/local/arm/3.4.1/arm-linux/include 说明了默认的
include 目录
输入 ./arm-linux-gcc -print-search-dirs 查看搜索的 lib 目录 , 主要的库
文件还是在
/usr/local/arm/3.4.1/arm-linux/lib 目录下 .
arm-linux-gcc 3.4.1 可以用来编译 2.6 的内核
而编译 bootloader 还是用原来的 2.95.2 版的 arm-linux-gcc
程序的预处理、 编译、链接都可以由 gcc 完成,gcc 会自动调用 cpp 来做预处理,
ld 来进行链接。其中对库的链接是很重要的一部分,有静态库和动态库两种,
静态库以 .a 为后缀, ld 会把静态库中的代码拷到待链接的程序中,形成完整
的可执行的程序。 而链接动态库生成可执行程序又分为静态调用和动态调用, 静
态调用是在程序中包含头文件直接调用库函数, 也叫显式调用, 程序被加载的同
时也加载了库,在加载时完成真正的地址链接。 而动态调用则不需要包含头文件,
在程序中使用库加载函数 dlopen 来加载库,使用 dlsym 来获取所需函数的地址,
所以是在需要时才加载动态库, 也是隐式调用。 这样编译时和库就没有关系, 不
需要链接了。