-I (大写i)-L-l(小写L) 的使用
Posted Heavy sea
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了-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库相关概念
以上是关于-I (大写i)-L-l(小写L) 的使用的主要内容,如果未能解决你的问题,请参考以下文章
linuxC编译参数CPPFLAGSCFLAGSLDFLAGS参数的理解
C++学习(三七二)CPPFLAGS CFLAGS LDFLAGS
g++ -I(大写i) 与-L(大写l)-l(小写l) 的作用与学习
gcc编译程序时的命令行参数-I(大写i) -L -l (小写L) 2020-10-10
java的class文件,经过反编译以后获得的源代码是L(小写),1,i(大写),o(大写和小写),0的组合,是怎么回事