当前位置:首页 » 编程软件 » linux编译链接

linux编译链接

发布时间: 2022-07-05 19:22:55

linux编译怎么链接静态库

静态库不能被打包到.o 文件 在C编译中, 是.c编译成.o,然后若干个.o打包成.a .a要比.o高一级的。 所以不能产生新的.o 你可以把.a文件解开 成为.o集合 加上你的.o文件, 共同打包成一个新的.a文件 这样是可行的。

⑵ linux 编译怎么连接动态库

Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用-L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用-l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

⑶ linux下c语言gcc编译的时候如果不知道.c文件怎么链接的

有以下步骤:

1.源程序的编译
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器. 下面
我们以一个实例来说明如何使用gcc编译器.
假设我们有下面一个非常简单的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要编译这个程序,我们只要在命令行下执行:
gcc -o hello hello.c
gcc 编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程
序的输出结果了.命令行中 gcc表示我们是用gcc来编译我们的源程序,-o 选项表示
我们要求编译器给我们输出的可执行文件名为hello 而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了. -o选项我们
已经知道了,表示我们要求输出的可执行文件名. -c选项表示我们只要求编译器输出
目标代码,而不必要输出可执行文件. -g选项表示我们要求编译器在编译的时候提
供我们以后对程序进行调试的信息.
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你
想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说
明.
2.Makefile的编写
假设我们有下面这样的一个程序,源代码如下:

#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
当然由于这个程序是很短的我们可以这样来编译
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
这样的话我们也可以产生main程序,而且也不时很麻烦.但是如果我们考虑一
下如果有一天我们修改了其中的一个文件(比如说mytool1.c)那么我们难道还要重
新输入上面的命令?也许你会说,这个很容易解决啊,我写一个SHELL脚本,让她帮我
去完成不就可以了.是的对于这个程序来说,是可以起到作用的.但是当我们把事情
想的更复杂一点,如果我们的程序有几百个源程序的时候,难道也要编译器重新一
个一个的去编译?
为此,聪明的程序员们想出了一个很好的工具来做这件事情,这就是make.我们
只要执行以下make,就可以把上面的问题解决掉.在我们执行make之前,我们要先
编写一个非常重要的文件.--Makefile.对于上面的那个程序来说,可能的一个
Makefile的文件是:
# 这是上面那个程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
有了这个Makefile文件,不过我们什么时候修改了源程序当中的什么文件,我们
只要执行make命令,我们的编译器都只会去编译和我们修改的文件有关的文件,其
它的文件她连理都不想去理的.
下面我们学习Makefile是如何编写的.
在Makefile中也#开始的行都是注释行.Makefile中最重要的是描述文件的依赖
关系的说明.一般的格式是:
target: components
TAB rule
第一行表示的是依赖关系.第二行是规则.
比如说我们上面的那个Makefile文件的第二行
main:main.o mytool1.o mytool2.o
表示我们的目标(target)main的依赖对象(components)是main.o mytool1.o
mytool2.o 当倚赖的对象在目标修改后修改的话,就要去执行规则一行所指定的命
令.就象我们的上面那个Makefile第三行所说的一样要执行 gcc -o main main.o
mytool1.o mytool2.o 注意规则一行中的TAB表示那里是一个TAB键
Makefile有三个非常有用的变量.分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件.
如果我们使用上面三个变量,那么我们可以简化我们的Makefile文件为:
# 这是简化后的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
经过简化后我们的Makefile是简单了一点,不过人们有时候还想简单一点.这里
我们学习一个Makefile的缺省规则

⑷ linux中编译链接出现了错误,但本人看不明白,错误信息请

首先你要了解编译的步骤,因为.c或(.cpp文件)文件是分离编译的,所以每个.c(或.cpp文件)编译的时候会存在一些对定义在其它.c文件的引用,但是编译起并不负责重定义这些引用,所以最后还要连接器。连接器把每个.c里面没有确定的变量的未定义符号重新定义,最后才产生出一个正确的可执行文件。
但是如果其它文件也没有定义那些符号的话,则会产生一个连接错误,而编译起显示的时候多半是说undefined reference.

看你这个程序,应该是某个变量没有定义,或者是定义域的问题。

⑸ 编译LINUX内核时为什么总是要建一个链接文件夹,链接到内核源码文件夹

习惯而已。

很多需要内核提供编译函数、参数支持的软件,都习惯到固定的地方去寻找内核源代码。而不是让你去设置。
相对来说,这样软件之间的兼容和交互会更方便。

内核在安装完后,有的时候他会在 /lib/moles/<Kernel Ver>/ 里面做一个到内核源代码地址的链接。但这样如果意外删掉了源代码,这个链接就会指向错误的地方。
所以很多时候,直接去某个特殊位置找源代码更好,而且有的时候计算机必须先用另外一个内核启动计算机后给新的内核编译驱动模块。这样的话,因为内核版本不同,会导致不能正确找到目标内核的版本和源代码位置。
这个时候一个约定俗成的链接地址,可以解决很大的问题。

⑹ linux 编译链接

链接有问题是找不到库文件 将库的路径加到/etc/ld.so.conf里面就行了 再ldconfig一下

⑺ linux编译时怎么链接dl文件

有以下步骤:
1.源程序的编译
在Linux下面,如果要编译一个C语言源程序,我们要使用GNU的gcc编译器.
下面
我们以一个实例来说明如何使用gcc编译器.
假设我们有下面一个非常简单的源程序(hello.c):
int
main(int
argc,char
**argv)
{
printf("Hello
Linux\n");
}
要编译这个程序,我们只要在命令行下执行:
gcc
-o
hello
hello.c
gcc
编译器就会为我们生成一个hello的可执行文件.执行./hello就可以看到程
序的输出结果了.命令行中
gcc表示我们是用gcc来编译我们的源程序,-o
选项表示
我们要求编译器给我们输出的可执行文件名为hello
而hello.c是我们的源程序文件.
gcc编译器有许多选项,一般来说我们只要知道其中的几个就够了.
-o选项我们
已经知道了,表示我们要求输出的可执行文件名.
-c选项表示我们只要求编译器输出
目标代码,而不必要输出可执行文件.
-g选项表示我们要求编译器在编译的时候提
供我们以后对程序进行调试的信息.
知道了这三个选项,我们就可以编译我们自己所写的简单的源程序了,如果你
想要知道更多的选项,可以查看gcc的帮助文档,那里有着许多对其它选项的详细说
明.
2.Makefile的编写
假设我们有下面这样的一个程序,源代码如下:

⑻ linux C语言 编译链接库的问题

编译环境和运行环境经常是不同的,在A机编译,B机运行。
你看到了,编译时候是 -L指定,运行时是LD_LIBRARY_PATH指定

⑼ linux下gcc编译时如何连接到mraa库

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了。当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)。
放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest,另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.so.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx
库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so,手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如gtk1.2的链接参数生成程序是gtk-config,执行gtk-config --libs就能得到以下输出"-
L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic -lgmole -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了--libs参数外还有一个参数是--cflags用来生成头文
件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config --libs --cflags,看看输出结果现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办
法是在编译命令行里加入这个`xxxx-config --libs --cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config --libs --cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。
除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config --list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg -config pagName --libs --cflags,其中pagName是包名,是pkg-config--list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+,pkg- config gtk+ --libs --cflags的作用跟gtk-config --libs --cflags是一样的。比如:gcc gtktest.c `pkg-config gtk+ --libs --cflags`。

热点内容
怎么下载压缩包 发布:2024-05-19 04:47:47 浏览:9
二嫂水仙ftp 发布:2024-05-19 04:47:42 浏览:160
云隙服务器下载 发布:2024-05-19 04:33:22 浏览:315
德国C语言 发布:2024-05-19 04:13:40 浏览:963
音频管理器没有文件夹 发布:2024-05-19 04:13:36 浏览:667
qq邮箱端口993服务器怎么填 发布:2024-05-19 04:07:05 浏览:204
javaapi框架 发布:2024-05-19 04:06:59 浏览:363
与存储结构无关的术语 发布:2024-05-19 04:05:41 浏览:500
编译路由器固件选择 发布:2024-05-19 03:56:28 浏览:42
手机f加密 发布:2024-05-19 03:28:47 浏览:225