-I (大写i)、-L、-l(小写L) 的使用

一、案例

目录下有以下文件:
main.c

#include <stdio.h>
#include "sub.h"

int main(int argc, char *argv[])
{
       int i;
       printf("Main fun!\n");
       sub_fun();
       return 0;
}

sub.c

void sub_fun(void)
{
       printf("Sub fun!\n");
}

sub.h

void sub_fun(void);

正常情况下可采用以下方法编译:
① 一起编译、链接:

gcc  -o test  main.c  sub.c

② 分开编译,统一链接:

gcc -c -o main.o  main.c
gcc -c -o sub.o   sub.c
gcc -o test main.o sub.o

多个文件的编译推荐使用分开编译的方法

二、指定头文件(-I 大写的i)

在案例文件,对文件main.c 做出以下更改:

#include <stdio.h>
#include <sub.h>

int main(int argc, char *argv[])
{
       int i;
       printf("Main fun!\n");
       sub_fun();
       return 0;
}

对文件进行编译:

gcc -c -o main.o main.c

结果显示找不到头文件,因为其默认在以下文件路径查找:

 /usr/lib/gcc/x86_64-linux-gnu/7/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

我们的头文件路径在当前目录下,需要用 - I人为指定

gcc -c -o main.o main.c -I ./

使用gcc -c -o main.o main.c -I ./ -v 可以查看编译过程中先去当前路径查找头文件再从默认路径查找
在这里插入图片描述

三、库文件中 -L -l(小写的L)

-L 指定链接时库文件目录
-l 指定链接哪一个库文件

制作静态库

对案例文件运行gcc -o test main.c,报错:
在这里插入图片描述
很显然需要gcc -o test main.c sub.c 将sub.c 链接进去
但我们也可以将sub.c 制作成静态库:

gcc -c -o sub.o   sub.c
ar  crs  libsub.a  sub.o 

使用静态库并运行:

gcc  -o  test  main.o  libsub.a 
 (如果.a不在当前目录下,需要 - L指定它的绝对或相对路径)
./test

制作动态库

gcc -c -o sub.o   sub.c
gcc -shared  -o libsub.so  sub.o

使用动态库:gcc -o test main.o -lsub 会从默认路径中找
(- l 指定链接哪一个库文件)
在这里插入图片描述
需要用 -L指定链接时库文件目录,gcc -o test main.o -lsub -L ./

运行动态库
运行直接./test会报错,可采用
① 先把libsub.so放到Ubuntu的/lib目录,然后就可以运行test程序。
② 如果不想把libsub.so放到/lib,也可以放在某个目录比如/a,然后如下执行:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/a  
./test

我们这里直接将libsub.so放在当前目录下,执行完成

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
./test

静态库与动态库的有关概念见Linux库相关概念

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值