linux下gcc编译中关于头文件与库文件搜索路径相关问题
GCC常见错误解析
GCC常见错误解析一、错误类型第一类∶C语法错误错误信息∶文件source.c中第n行有语法错误(syntex errror)。
这种类型的错误,一般都是C语言的语法错误,应该仔细检查源代码文件中第n行及该行之前的程序,有时也需要对该文件所包含的头文件进行检查。
有些情况下,一个很简单的语法错误,gcc会给出一大堆错误,此时要保持清醒的头脑,不要被其吓倒,必要的时候再参考一下C语言的基本教材。
第二类∶头文件错误错误信息∶找不到头文件head.h(Can not find include file head.h)。
这类错误是源代码文件中的包含头文件有问题,可能的原因有头文件名错误、指定的头文件所在目录名错误等,也可能是错误地使用了双引号和尖括号。
第三类∶档案库错误错误信息∶连接程序找不到所需的函数库,例如∶ld: -lm: No such file or directory.这类错误是与目标文件相连接的函数库有错误,可能的原因是函数库名错误、指定的函数库所在目录名称错误等,检查的方法是使用find命令在可能的目录中寻找相应的函数库名,确定档案库及目录的名称并修改程序中及编译选项中的名称。
第四类∶未定义符号错误信息∶有未定义的符号(Undefined symbol)。
这类错误是在连接过程中出现的,可能有两种原因∶一是使用者自己定义的函数或者全局变量所在源代码文件,没有被编译、连接,或者干脆还没有定义,这需要使用者根据实际情况修改源程序,给出全局变量或者函数的定义体;二是未定义的符号是一个标准的库函数,在源程序中使用了该库函数,而连接过程中还没有给定相应的函数库的名称,或者是该档案库的目录名称有问题,这时需要使用档案库维护命令ar检查我们需要的库函数到底位于哪一个函数库中,确定之后,修改gcc 连接选项中的-l和-L项。
排除编译、连接过程中的错误,应该说这只是程序设计中最简单、最基本的一个步骤,可以说只是开了个头。
gcc编译动态库文件路径制定方法
gcc编译动态库文件路径制定方法在使用gcc编译动态库时,可以使用一些特定的选项和方法来指定文件的路径。
下面将详细介绍几种常见的方法。
1.使用绝对路径:使用绝对路径是最简单、最直接的方法。
在编译时,可以将文件的绝对路径直接写入命令中,gcc将按照路径编译相应的文件。
例如:```gcc -shared -o libexample.so /path/to/example.c```这将把example.c编译成动态库libexample.so,并将其输出到指定路径中。
2.使用相对路径:使用相对路径时,需要注意当前工作目录的位置。
可以使用"./"表示当前目录,也可以使用"../"表示上级目录。
例如:```gcc -shared -o libexample.so ./example.cgcc -shared -o libexample.so ../src/example.c```3.使用-I选项指定头文件路径:在编译动态库时,可能还需要指定头文件的路径,以便正确包含头文件的内容。
可以使用"-I"选项来指定头文件路径。
例如:```gcc -shared -o libexample.so -I./include example.c```上述命令将指定当前目录下的include目录作为头文件路径,编译example.c。
4.使用-L选项指定库文件路径:当编译动态库时,如果需要链接其他的库文件,需要指定库文件的路径。
可以使用"-L"选项来指定库文件路径。
例如:```gcc -shared -o libexample.so -L./lib example.c -lexamplelibs ```上述命令将指定当前目录下的lib目录作为库文件路径,同时链接名为libexamplelibs的动态库。
5. 使用-rpath选项指定运行时库路径:在编译时指定运行时库的路径比较常见,可以通过使用"-rpath"来指定。
linux的gcc使用方法
linux的gcc使用方法Linux是一种开源的操作系统,广泛应用于服务器和嵌入式系统中。
而GCC(GNU Compiler Collection)是Linux下最常用的编译器套件之一,用于将源代码编译成可执行文件。
本文将介绍GCC的使用方法,帮助读者快速上手。
一、安装GCC在Linux系统中,默认情况下已经安装了GCC。
可以通过运行以下命令来验证是否已经安装了GCC:```gcc --version```如果GCC已经安装,则会显示GCC的版本信息;如果没有安装,则可以通过运行以下命令来安装GCC:```sudo apt-get install gcc```二、编写源代码在使用GCC之前,我们需要先编写源代码。
可以使用任何文本编辑器创建一个以.c为后缀的源文件,例如hello.c。
下面是一个示例的源代码:```c#include <stdio.h>int main() {printf("Hello, world!\n");return 0;}```三、编译源代码编写完源代码后,我们可以使用GCC来将其编译成可执行文件。
在终端中运行以下命令:```gcc -o hello hello.c```其中,-o参数用于指定编译后生成的可执行文件的名称,hello为示例的可执行文件名,hello.c为源代码文件名。
如果编译成功,GCC将会生成一个名为hello的可执行文件。
四、运行可执行文件在编译成功后,我们可以通过以下命令来运行可执行文件:```./hello```如果一切顺利,终端将会输出"Hello, world!"的字符串。
五、GCC的其他常用选项除了上述基本的使用方法外,GCC还提供了许多其他的选项,用于控制编译过程的行为。
以下是一些常用的选项:- -Wall:开启所有警告信息的显示。
- -g:生成供调试器使用的调试信息。
- -O2:进行优化处理,提高程序执行效率。
linuxgcc命令及用法
linuxgcc命令及用法Linux的gcc命令是一款非常强大的编译器,用于将源代码转换为可执行文件。
本文将详细介绍gcc命令及其常用的用法,帮助读者更好地理解和使用这款工具。
一、gcc命令的基本语法结构gcc是GNU Compiler Collection(GNU编译器集合)的简称,因此其命令基本语法结构一般为:shellgcc [选项] [输入文件]其中,选项用于指定编译时的相关参数,输入文件则是需要编译的源文件。
二、gcc命令的常用选项gcc命令提供了许多选项,用于控制编译过程及生成的可执行文件的属性。
下面是一些常用的gcc选项及其作用:1. -o:用于指定输出文件的名称。
例如,使用`-o myprogram`选项将输出文件命名为myprogram。
2. -c:仅进行编译,不进行链接操作。
这个选项常用于编译多个源文件时,先将每个源文件编译为目标文件,再进行链接操作。
3. -g:生成调试信息。
这个选项会在编译时生成与调试器兼容的调试信息,方便开发人员进行程序调试。
4. -Wall:显示所有警告信息。
使用这个选项可以使编译器在编译时输出更多的警告信息,帮助开发人员提前发现潜在的问题。
5. -I:指定头文件的搜索路径。
使用这个选项可以告诉编译器在指定的路径中查找头文件,方便引用外部库、模块等。
6. -L:指定库文件的搜索路径。
与-I选项类似,这个选项用于告诉编译器在指定的路径中查找库文件,用于链接时的库文件搜索。
7. -l:指定要链接的库文件。
使用这个选项可以显式地告诉编译器要链接的库文件,如:-lmath将链接math库文件。
三、gcc命令的应用实例下面通过几个实例来演示gcc命令的具体用法,以帮助读者更好地理解和掌握这款工具。
1. 编译单个源文件并生成可执行文件假设我们有一个名为`hello.c`的源文件,内容如下:c#include <stdio.h>int main() {printf("Hello, World!\n");return 0;}我们可以使用以下命令将其编译为可执行文件`hello`:shellgcc -o hello hello.c编译成功后,即可在当前目录下生成名为`hello`的可执行文件。
GCC编译选项和环境变量
GCC编译选项和环境变量https:///DLUTXIE/article/details/8176164本⽂由GCC⼿册翻译得到,英语能⼒有限,翻译得不太好,仅为⾃⼰做记录,⽤于理解GCC编译时头⽂件及库⽂件的查找路径问题。
-Idir表⽰增加dir为头⽂件的搜索路径,这个路径优先于系统的默认路径,所以⽤⾃⼰指定的头⽂件来替代系统默认的头⽂件。
但是不要⽤这个选项来指定路径不要包括供应商提供的系统头⽂件(这个情况可以⽤-isystem),如果有多个-I选项,则路径的搜索先后顺序是从左到右的。
,即在前⾯的路径会被选搜索。
另外,如果dir以=号开头即如–I=dir,⽽其中的=号为被sysroot前缀替换。
如果⼀个标准系统包含的⽬录或者⽤-isystem选项指定的⽬录同时⽤了-I选项,则-I选项会被忽略。
那个⽬录仍然会被搜索,只是和没有指定-I选项时⼀样。
这是为了确保GCC程序能过够修复系统头⽂件的bug和⾮故意的改变include_next指令的顺序。
如果你确实需要改变系统路径的搜索顺序,那你可以⽤”-nostdinc” 和/或者“-isystem”选项。
-nostdinc该选项指⽰不要搜索头⽂件的标准路径(即默认路径),⽽只搜索-I选项指定的路径和当前路径。
-isysroot dir该选项和—sysroot选项差不多,但只⽤于搜索头⽂件。
--sysroot=dir⽤dir作为头⽂件和库⽂件的逻辑根⽬录,例如,正常情况下,如果编译器在/usr/include搜索头⽂件,在/usr/lib下搜索库⽂件,它将⽤dir/usr/include和dir/usr/lib替代原来的相应路径。
如果你同时使⽤了-isysroot选项,则—sysroot会应⽤于库⽂件的搜索⽽-isysroot会⽤于搜索头⽂件。
-system dir该选项⽤于搜索头⽂件,但该选项指定的⽬录估在-I选项指定的⽬录后搜索⽽在系统默认路径前搜索。
linux 头文件、库文件查找顺序
linux 头文件、库文件查找顺序默认分类 2009-11-14 01:24:28 阅读126 评论0 字号:大中小linux 头文件、库文件查找顺序2009-11-03 12:36Include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。
当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib()写在specs内的后来用-D -I -L指定的gcc环境变量设定(编译的时候)ld.so的环境变量(这是run time的时候)一、头文件gcc 在编译时如何去寻找所需要的头文件:※所以header file的搜寻会从-I开始※然后找gcc的环境变量C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH ※再找内定目录/usr/include/usr/local/include/usr/lib/gcc-lib/i386-linux/2.95.2/include/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g -3/usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是/usr/includeprefix/includeprefix/xxx-xxx-xxx-gnulibc/includeprefix/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/ld.so.conf中指定动态库搜索路径2、通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号":"分隔)3、在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。
linux动态库(.so)搜索路径(目录)设置方法
linux动态库(.so)搜索路径(⽬录)设置⽅法在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可通过三种⽅法来指定:⽅法⼀:在配置⽂件/etc/ld.so.conf中指定动态库搜索路径;⽅法⼆:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径;⽅法三:在编译⽬标代码时指定该程序的动态库搜索路径。
众所周知,Linux动态库的默认搜索路径是/lib和/usr/lib。
动态库被创建后,⼀般都复制到这两个⽬录中。
当程序执⾏时需要某动态库,并且该动态库还未加载到内存中,则系统会⾃动到这两个默认搜索路径中去查找相应的动态库⽂件,然后加载该⽂件到内存中,这样程序就可以使⽤该动态库中的函数,以及该动态库的其它资源了。
在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种⽅法来指定。
⽅法⼀:在配置⽂件/etc/ld.so.conf中指定动态库搜索路径。
vi /etc/ld.so.conf添加 lib⽬录ldconfig⽅法⼆:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
export LD_LIBRARY_PATH=”LD_LIBRARY_PATH:/opt/”⽅法三:在编译⽬标代码时指定该程序的动态库搜索路径。
还可以在编译⽬标代码时指定程序的动态库搜索路径。
通过gcc 的参数”-Wl,-rpath,”指定其中⽅法三可以避免安装部署的⿇烦⽅法三⽰例假设main.cpp,hello.h,hello.cpp,其中main.cpp调⽤了hello类中的⽅法1 ⽣成hello.sog++ -shared hello.cpp -o libhello.so2 编译main.cpp,并链接,并指定运⾏时libhello.so的位置 g++ main.cpp -lhello -L./ -Wl,-rpath=./ -o main值得⼀提的是,如果采⽤带版本号的库,例如libhello.so.2链接命令可使⽤g++ main.cpp libhello.so.2 -L./ -Wl,-rpath=./ -o main2)加⼊第⼆个so库g++ main.cpp -L./second/ -Wl,-rpath=./second/ -lsecond -L./hello/ -Wl,-rpath=./hello/ -lhello -o mainps,遇到过⼀个奇怪的问题,就是假设libhello.so还⽤到了libother.so,由于在/etc/ld.so.conf⾥配置错误了libother.so的⽬录路径,导致⼀直产⽣undefined reference to错误,但是在⼯程⾥对libother⽬录路径配置是正确的,有可能于查找路径顺序有关。
简述gcc命令的选项
简述gcc命令的选项GCC是GNU Compiler Collection的缩写,是一款开源的编译器,支持多种编程语言,包括C、C++、Objective-C、Fortran、Ada等。
GCC命令的选项非常多,可以根据不同的需求进行选择,下面将对GCC命令的选项进行简述。
1. 常用选项(1)-c:只编译不链接,生成目标文件。
(2)-o:指定输出文件名。
(3)-g:生成调试信息。
(4)-Wall:开启所有警告信息。
(5)-Werror:将警告信息视为错误。
(6)-O:优化选项,包括-O0、-O1、-O2、-O3等级别。
(7)-I:指定头文件搜索路径。
(8)-L:指定库文件搜索路径。
(9)-l:指定链接的库文件名。
2. 预处理选项(1)-E:只进行预处理,输出预处理结果。
(2)-D:定义宏。
(3)-U:取消定义宏。
(4)-I:指定头文件搜索路径。
(5)-M:输出依赖关系。
3. 编译选项(1)-S:只编译不汇编,生成汇编代码。
(2)-fPIC:生成位置无关代码。
(3)-fno-strict-aliasing:关闭严格别名规则。
(4)-fno-omit-frame-pointer:不省略函数栈帧指针。
(5)-fno-common:禁止共享数据段。
(6)-fno-builtin:禁用内建函数。
(7)-fno-stack-protector:禁用栈保护。
4. 链接选项(1)-shared:生成共享库。
(2)-static:生成静态库。
(3)-nostdlib:不使用标准库。
(4)-nodefaultlibs:不使用默认库。
(5)-Wl:传递参数给链接器。
(6)-rpath:指定运行时库搜索路径。
5. 其他选项(1)-v:显示编译器版本信息。
(2)-dumpversion:显示编译器版本号。
(3)-dumpmachine:显示编译器目标机器。
(4)-print-search-dirs:显示搜索路径。
(5)-print-libgcc-file-name:显示libgcc文件路径。
gcc编译链接时指定头文件和库文件搜索路径
gcc编译链接时指定头文件和库文件搜索路径2010-05-24 18:16问题:sudo gcc rongji_ssl.c -lssl提示找不到openssl/ssl.h等头文件的错误原因:gcc在系统默认指定的头文件搜索目录下没找到,默认的头文件搜索目录为:/usr/include/usr/local/include以及/usr/lib/gcc下的一些include目录注意以上搜索目录也包含子目录!解决:方法1:sudo cp -rf /usr/local/ssl/include/openssl /usr/include/方法2:在编译后面加-I/usr/local/ssl/include================================================解决了上面问题后,sudo gcc rongji_ssl.c -lssl又出现了一个新问题:/usr/bin/ld: cannot find -lssl原因:gcc在默认的库搜索路径下找不到ssl库文件。
默认的库(包括动、静态库)搜索路径为:/lib、/usr/lib、/usr/local/lib、另外动态库搜索路径还可以由:LD_LIBRARY_PATH环境变量(profile中定义)、/etc/ld.so.conf中指定。
与添加头文件搜索路径类似,在编译时添加-L参数可指定搜索动、静态库的路径。
默认情况下,gcc在链接时优先使用动态库,只有当动态库不存在时才考虑使用静态库,如果需要的话可以在编译时加上-static选项,强制使用静态库。
如:gcc foo.c -L /home/xiaowp/lib -static -lfoo解决:通过查找,当前的ssl库为:/usr/lib/libssl.so.0.9.8/usr/local/ssl/lib/libssl.a因此上面的解决方法有:方法1:在编译后面加-L/usr/local/ssl/lib,使gcc找到并使用静态库。
GCC编译时头文件路径问题
GCC_EXEC_PREFIX 的默认设置为 prefix /lib/gcc-lib/ ,这里的 prefix 是安装编译程序时 configure 脚本指定的名字。该前缀也用于定位标准连接程序文件,包含进来作为可执行程序的一部分。 如果使用 -B 命令行TH 。
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
可以通过编辑配置文件/etc/ld.so.conf来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。我们通过例1来说明该方法。
例1:
我们通过以下命令用源程序pos_conf.c(见程序1)来创建动态库 libpos.so,详细创建过程请参考文[1]。
网友回复:你引用的是内核下的头文件.
不在/usr/include下.
在: /usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h 下面... 中间的版本号是不一样的...你选你的就行了..
网友回复:请问楼上为什么是在/usr/src/kernels/2.6.18-8.el5-x86_64/include/linux/module.h呢?我查了一下环境变量,没有看到关于头文件的环境变量。gcc是如何知道头文件的位置的?
} 程序1: pos_conf.c
gcc常见的编译警告与错误(按字母顺序排列)
gcc 常见的编译警告与错误(按字母顺序排列)C语言初学者遇到的最大问题往往是看不懂编译错误,进而不知如何修改程序。
有鉴于此,本附录罗列了用gcc编译程序时经常出现的编译警告与错误。
需要提醒读者的是,出现警告(warning)并不影响目标程序的生成,但出现错误(error)则无法生成目标程序。
为便于读者查阅,下面列出了经常遇到的警告与错误,给出了中英文对照(英文按字典顺序排列),并对部分错误与警告做了必要的解释。
#%s expects \FILENAME\ or …#%s 需要 \FILENAME\ 或…#%s is a deprecated GCC extension#%s 是一个已过时的 GCC 扩展#%s is a GCC extension#%s 是一个 GCC 扩展#~ error:#~ 错误:#~ In file included from %s:%u#~ 在包含自 %s:%u 的文件中#~ internal error:#~ 内部错误:#~ no newline at end of file#~ 文件未以空白行结束#~ warning:#~ 警告:#elif after #else#elif 出现在 #else 后#elif without #if#elif 没有匹配的 #if#else after #else#else 出现在 #else 后#else without #if#else 没有匹配的 #if#endif without #if#endif 没有匹配的 #if#include nested too deeply#include 嵌套过深#include_next in primary source file#include_next 出现在主源文件中#pragma %s %s is already registered#pragma %s %s 已经被注册#pragma %s is already registered#pragma %s 已经被注册#pragma once in main file#pragma once 出现在主文件中#pragma system_header ignored outside include file#pragma system_heade 在包含文件外被忽略%.*s is not a valid universal character%.*s 不是一个有效的 Unicode 字符%s in preprocessing directive预处理指示中出现 %s%s is a block device%s 是一个块设备%s is shorter than expected%s 短于预期%s is too large%s 过大%s with no expression%s 后没有表达式%s: not used because `%.*s’ defined as `%s’ not `%.*s’ %s:未使用因为‘%.*s’被定义为‘%s’而非‘%*.s’%s: not used because `%.*s’ is poisoned%s:未使用因为‘%.*s’已被投毒%s: not used because `%.*s’ not def ined%s:未使用因为‘%.*s’未定义%s: not used because `%s’ is defined%s:未使用因为‘%s’已定义%s: not used because `__COUNTER__’ is invalid%s:未使用因为‘__COUNTER__’无效(\%s\ is an alternative token for \%s\ in C++)(在 C++ 中“%s”会是“%s”的替代标识符)(this will be reported only once per input file)(此警告为每个输入文件只报告一次)\%s\ after # is not a positive integer# 后的“%s”不是一个正整数\%s\ after #line is not a positive integer#line 后的“%s”不是一个正整数\%s\ cannot be used as a macro name as it is an operator in C++ “%s”不能被用作宏名,因为它是 C++ 中的一个操作符\%s\ is not a valid filename“%s”不是一个有效的文件名\%s\ is not defined“%s”未定义\%s\ may not appear in macro parameter list“%s不能出现在宏参数列表中\%s\ re-asserted重断言“%s”\%s\ redefined“%s重定义\/*\ within comment“/*出现在注释中\\x used with no following hex digits\\x 后没有 16 进制数字\defined\ cannot be used as a macro name“defined不能被用作宏名__COUNTER__ expanded inside directive with -fdirectives-only带 -fdirectives-only 时 __COUNTER__ 在指示中扩展__VA_ARGS__ can only appear in the expansion of a C99 variadic macro __VA_ARGS__ 只能出现在 C99 可变参数宏的展开中_Pragma takes a parenthesized string literal_Pragma 需要一个括起的字符串字面常量‘%.*s’ is not in NFC‘%.*s’不在 NFC 中‘%.*s’ is not in NFKC‘%.*s’不在 NFKC 中‘##’ cannot appear at either end of a macro expansion‘##’不能出现在宏展开的两端‘#’ is not followed by a macro parameter‘#’后没有宏参数‘$’ in identifier or number‘$’出现在标识符或数字中‘:’ without preceding ‘?’‘:’前没有‘?’‘?’ without following ‘:’‘?’后没有‘:’'return' with a value, in function returning void在void返回类型的函数中,return返回值。
gcc -include选项的用法
gcc -include选项的用法标题:GCC中include选项的用法及详细解析引言:GCC是一款常用的编译器,广泛应用于各种平台和编程语言中。
在使用GCC进行编译时,include选项是非常常用的一个选项,它能够指定编译器搜索头文件的路径。
本文将详细介绍GCC中include选项的用法,并针对不同情况进行一步一步的解析,帮助读者更好地理解和应用include选项。
第一部分:include选项的基础知识1.1 include选项的作用include选项用于指定编译器搜索头文件的路径,即告诉编译器在哪里查找头文件。
1.2 include选项的格式GCC的include选项的格式为:-I <路径>,其中“-I”是一个固定的标记,后面跟上具体的路径。
第二部分:include选项的常见用法2.1 指定系统头文件路径在使用GCC编译程序时,需要使用系统提供的头文件,这些头文件通常安装在标准路径下,如/usr/include。
可以使用include选项来指定系统头文件路径,以确保编译器能够正确找到所需的头文件。
示例命令:gcc -I/usr/include program.c2.2 指定自定义头文件路径在编写程序时,有时会使用到自定义的头文件。
可以使用include选项来指定自定义头文件路径,以确保编译器能够找到这些头文件。
示例命令:gcc -I/path/to/header program.c2.3 添加多个头文件路径如果项目中使用到了多个自定义头文件路径,可以使用多个include选项来指定这些路径。
示例命令:gcc -I/path/to/header1 -I/path/to/header2 program.c2.4 使用相对路径在某些情况下,我们可能希望使用相对路径来引用头文件。
可以使用include选项结合相对路径来实现这一目的。
示例命令:gcc -I./include program.c第三部分:include选项的进阶使用3.1 使用尖括号或双引号在使用include选项时,可以选择使用尖括号(<>)或双引号("")来引用头文件。
Linux系统下C语言编程及技巧研究
Linux系统下C语言编程及技巧研究Linux是一种自由和开放源代码的类Unix操作系统,广泛用于服务器领域。
同时,Linux系统也是许多开发者和程序员首选的开发环境。
因此,掌握在Linux系统下C语言编程及技巧非常重要。
本文将重点介绍在Linux下进行C语言编程的一些技巧和要点。
1. GNU编译器工具集(GCC)GCC是 GNU编译器工具集的简称,支持多种编程语言,如C、C++、Objective-C、Java等。
在Linux系统下,GCC是编译C程序的主要工具。
开发者可以通过命令行或集成式开发环境(IDE)使用GCC。
2. 环境变量环境变量是Linux系统的重要概念,能够帮助开发者方便地访问系统资源和软件库。
开发者可以通过设置环境变量,指定GCC的默认搜索路径和库路径。
例如,下列命令可将环境变量C_INCLUDE_PATH设置为当前目录:export C_INCLUDE_PATH=.3. 头文件头文件在C语言程序的编写过程中是非常重要的。
Linux系统提供了许多C语言头文件,例如stdio.h、stdlib.h等。
开发者也可以根据需求编写自己的头文件。
在编写程序时,一定要正确地包含头文件。
否则编译器将无法识别预定义的类型和函数。
例如,下列程序演示了如何使用stdio.h头文件中的printf函数:4. 动态链接库动态链接库(Dynamic Linking Libraries,DLL)提供了跨多个程序共享函数和代码的能力。
在Linux系统下,动态链接库通常以.so文件形式出现。
开发者可以通过指定链接器选项使用动态链接库。
例如,下列命令将可执行文件myprog连接到数学库libm.so:gcc -o myprog myprog.c -lm5. 调试器调试器是程序员的重要工具。
调试器能够帮助开发者在程序崩溃或产生错误时追踪问题。
在Linux系统下,调试器gdb(GNU调试器)是普遍使用的工具。
例如,下列命令启动了gdb并加载了可执行文件:gdb ./myprog在gdb命令行下,可以执行多种命令来分析程序的行为,如查看变量的值、单步执行代码、设置断点等。
Linux下库的设置:ld.so.conf文件与PKG_CONFIG_PATH变量
一、编译和连接一般来说,如果库的头文件不在 /usr/include 目录中,那么在编译的时候需要用 -I 参数指定其路径。
由于同一个库在不同系统上可能位于不同的目录下,用户安装库的时候也可以将库安装在不同的目录下,所以即使使用同一个库,由于库的路径的不同,造成了用 -I 参数指定的头文件的路径也可能不同,其结果就是造成了编译命令界面的不统一。
如果使用 -L 参数,也会造成连接界面的不统一。
编译和连接界面不统一会为库的使用带来麻烦。
为了解决编译和连接界面不统一的问题,人们找到了一些解决办法。
其基本思想就是:事先把库的位置信息等保存起来,需要的时候再通过特定的工具将其中有用的信息提取出来供编译和连接使用。
这样,就可以做到编译和连接界面的一致性。
其中,目前最为常用的库信息提取工具就是下面介绍的 pkg-config。
pkg-config 是通过库提供的一个 .pc 文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。
这些信息可以通过 pkg-config 提供的参数单独提取出来直接供编译器和连接器使用。
The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the make file execution.pkg-config is a function that returns meta information for the specified library.The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig. You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files are installed. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during r un-time.在默认情况下,每个支持 pkg-config 的库对应的 .pc 文件在安装后都位于安装目录中的 lib/pkgconfig目录下。
gcc编译动态库文件路径制定方法
gcc编译动态库文件路径制定方法在GCC编译动态库时,可以通过指定文件路径来告诉编译器在哪里查找源文件和依赖的库文件。
这样可以方便地将不同目录下的源文件和库文件组合在一起编译成动态库。
下面将详细介绍GCC编译动态库时文件路径指定的方法。
1.指定源文件路径:在GCC编译动态库时,可以使用-I选项指定头文件的路径,该路径可以是绝对路径或相对路径。
例如,假设动态库的源文件放在src目录下,可以使用以下命令指定源文件路径:gcc -c -I./src file.c -o file.o这样,GCC会在当前目录下的src目录中查找file.c源文件,并将编译结果保存到file.o中。
2.指定库文件路径:在GCC编译动态库时,可以使用-L选项指定库文件的路径,该路径可以是绝对路径或相对路径。
例如,假设动态库的依赖库文件放在lib目录下,可以使用以下命令指定库文件路径:gcc -L./lib -o libmylib.so file1.o file2.o -ldependency这样,GCC会在当前目录下的lib目录中查找依赖库文件,并链接到生成的动态库中。
3.设置环境变量:除了通过命令行参数指定文件路径外,还可以通过设置环境变量来告诉GCC查找文件的路径。
例如,可以使用以下命令设置头文件路径的环境变量:export C_INCLUDE_PATH=/path/to/include这样,GCC在编译时会自动在指定的路径中查找头文件。
类似地,可以使用以下命令设置库文件路径的环境变量:export LD_LIBRARY_PATH=/path/to/lib这样,GCC在链接时会自动在指定的路径中查找库文件。
4.编译多个源文件:在编译动态库时,一般会将多个源文件一起编译成目标文件,然后再链接成动态库。
可以通过指定源文件路径和库文件路径来实现这一操作。
例如,假设动态库的源文件分别为file1.c和file2.c,依赖的库文件为dependency1.so和dependency2.so,可以使用以下命令来编译和链接动态库:gcc -c -I./src file1.c -o file1.ogcc -c -I./src file2.c -o file2.ogcc -L./lib -o libmylib.so file1.o file2.o -ldependency1 -ldependency2这样,GCC会分别在当前目录下的src目录中查找file1.c和file2.c源文件,并将编译结果保存到file1.o和file2.o中。
linux gcc 常用命令
linux gcc 常用命令Linux GCC 常用命令一、概述GCC(GNU Compiler Collection)是一套广泛使用的编程语言编译器集合,包括C、C++、Objective-C、Fortran、Ada和Go等语言的编译器。
本文将介绍Linux下使用GCC编译器常用的命令。
二、编译源代码1. gccgcc命令用于编译C语言源代码文件。
使用方法如下:gcc [选项] 源文件例如,编译名为hello.c的源代码文件:gcc hello.c2. g++g++命令用于编译C++语言源代码文件。
使用方法与gcc类似:g++ [选项] 源文件例如,编译名为hello.cpp的源代码文件:g++ hello.cpp三、生成可执行文件1. -o使用-o选项可以指定生成的可执行文件的名称。
例如:gcc -o hello hello.c2. -c使用-c选项可以将源代码编译成目标文件,而不生成可执行文件。
例如:gcc -c hello.c这样会生成名为hello.o的目标文件。
四、链接目标文件1. ldld命令用于将目标文件链接成可执行文件。
例如:ld -o hello hello.o2. -l使用-l选项可以指定需要链接的库文件。
例如,链接名为libmath.so的数学库文件:gcc -o hello hello.o -lmath五、调试程序1. gdbgdb是GNU Project开发的调试工具,可以用于调试C和C++程序。
使用方法如下:gdb 可执行文件例如,调试名为hello的可执行文件:gdb hello2. -g使用-g选项可以在编译时加入调试信息,方便调试程序。
例如:gcc -g hello.c六、优化编译1. -O使用-O选项可以进行编译优化。
例如:gcc -O2 hello.c2. -Os使用-Os选项可以进行尺寸优化。
例如:gcc -Os hello.c七、其他常用选项1. -Wall使用-Wall选项可以开启所有警告信息。
linux 标准库头文件的路径
linux 标准库头文件的路径
Linux 标准库头文件的路径取决于你所使用的发行版和安
装的软件包管理器。
一般来说,Linux 系统的标准库头文
件位于 `/usr/include` 目录下。
以下是一些常见的 Linux 发行版的标准库头文件路径:
- Ubuntu、Debian、Linux Mint:`/usr/include`
- CentOS、Fedora、Red Hat Enterprise Linux:
`/usr/include`
- Arch Linux:`/usr/include`
- openSUSE:`/usr/include`
- Gentoo:`/usr/include`
请注意,这些路径是默认的安装路径,如果你的系统有特
殊的配置,可能会有所不同。
另外,一些特定的库可能会有自己的头文件路径。
例如,OpenGL 的头文件路径是 `/usr/include/GL`,C++ 标准库
的头文件路径是 `/usr/include/c++`。
如果你想要查找特定库的头文件路径,可以使用 `pkg-config` 命令。
例如,要查找 `libcurl` 库的头文件路径,可以运行以下命令:
pkg-config --cflags libcurl
这将输出 `libcurl` 库的头文件路径。
总之,要获取 Linux 标准库头文件的路径,你可以首先检
查 `/usr/include` 目录,如果需要特定库的头文件路径,可以使用 `pkg-config` 命令来查找。
Linux 下GCC的使用
linux下gcc编译器的使用在为Linux开发应用程序时,绝大多数情况下使用的都是C语言,因此几乎每一位Linux程序员面临的首要问题都是如何灵活运用C编译器。
目前Linux下最常用的C语言编译器是GCC(GNU Compiler Collection),它是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
GCC 不仅功能非常强大,结构也异常灵活。
最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java、 Fortran、Pascal、Modula-3和Ada等。
开放、自由和灵活是Linux的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。
在使用GCC编译程序时,编译过程可以被细分为四个阶段:◆ 预处理(Pre-Processing)◆ 编译(Compiling)◆ 汇编(Assembling)◆ 链接(Linking)Linux程序员可以根据自己的需要让GCC在编译的任何阶段结束,以便检查或使用编译器在该阶段的输出信息,或者对最后生成的二进制文件进行控制,以便通过加入不同数量和种类的调试代码来为今后的调试做好准备。
和其它常用的编译器一样,GCC也提供了灵活而强大的代码优化功能,利用它可以生成执行效率更高的代码。
GCC提供了30多条警告信息和三个警告级别,使用它们有助于增强程序的稳定性和可移植性。
此外,GCC还对标准的C和C++语言进行了大量的扩展,提高程序的执行效率,有助于编译器进行代码优化,能够减轻编程的工作量。
GCC起步在学习使用GCC之前,下面的这个例子能够帮助用户迅速理解GCC的工作原理,并将其立即运用到实际的项目开发中去。
首先用熟悉的编辑器输入清单1所示的代码:清单1:hello.c#include <stdio.h>int main(void){printf ("Hello world, Linux programming!\n");return 0;}然后执行下面的命令编译和运行这段程序:# gcc hello.c -o hello # ./hello Hello world, Linux programming!从程序员的角度看,只需简单地执行一条GCC命令就可以了,但从编译器的角度来看,却需要完成一系列非常繁杂的工作。
环境变量,include搜索路径,lib库搜索路径
环境变量,include搜索路径,lib库搜索路径环境变量系统环境变量我们知道,我们经常要设置⼀些环境变量,系统环境变量我们⾮常容易理解。
其实我们在windows中经常容易接触。
其实环境变量是⼀个⾮常⼴泛的⼀个概念,它与web应⽤程序中的web.config所处的⾓⾊很像。
什么意思呢?就是说,程序(系统或应⽤)要运⾏的时候,它的基本业务逻辑可能是⼀定的,但是实现业务逻辑的时候有些设置性的东西却可以改变程序很多。
如web应⽤程序,编译之后他的业务逻辑基本不会发⽣改变,但是如果你更改⼀些web.config中的参数,程序的运⾏就会发⽣相应的改变。
这些设置。
就像电视机上⾯调制⼀样。
改变了设置会得到某些不同。
那么环境变量可以理解成设置的⼀种,为什么有不直接称为设置呢?因为它处于⼀种被动的境地。
越多说越糊涂。
最常见的环境变量莫过于PATH,和ClassPATH,这个在设置jdk的时候就需要设置,这⾥的PATH变量指的是,当系统的接⼝接收到⼀个程序启动命令的时候,除了默认在当前⽬录下寻找那个可执⾏⽂件意外,还需要到那些地⽅寻找。
有了这个设置,你就不需要⼀定要进⼊那个⽬录才能执⾏那个程序了。
ClassPATH变量也差不多,它设置的是那些类似于动态库的路径,也就是说,程序在执⾏的时候,发现要引⼊动态库,那样就要在这个变量指定的地⽅去找。
在linux中,系统也有⼀个PATH变量。
其实系统有⼀个⽂件是专门记录那些环境变量的。
1)etcprofile,系统登录会执⾏这个⽂件在当前环境中引⼊那些变量。
2)还有 homeali.bashrc 这个⽂件,简单的来说,etcprofile是对全局有效的,⽽.bashrc是对当前⽤户有效.3)还有⼀种设置⽅法,就是通过终端命令直接修改,我们知道前⾯两个⽂件其作⽤的⽅式就是当程序进⼊状态的时候,他们会被执⾏引⼊到当前空间,那么在当前状态下就会有这些变量,程序也就是可以使⽤它们。
那么如果我们直接在内存中修改该他们,就可以起到暂时的作⽤。
C和C++中include搜索路径的一般形式以及gcc搜索头文件的路径
C和C++中include搜索路径的⼀般形式以及gcc搜索头⽂件的路径C和C++中include 搜索路径的⼀般形式对于include 搜索的路径: C中可以通过 #include <stdio.h> 和 #include "stidio.h" ,区别是: 在UNIX系统中,尖括号告诉编译器在⼀个或者多个标准系统⽬录中找到⽂件 /usr/include /usr/local/include;即系统头⽂件所在的⽬录。
看看这些⽂件夹下是否有该头⽂件;如果没有,也不会检索当前⽂件所在路径,并将报错。
使⽤双引号,编译器先到当前⽬录查找头⽂件或⽂件名中指定的其他⽬录,如果没找到在到标准系统⽬录查找。
即,⾸先搜索本地⽬录,但是具体哪个⽬录依赖于编译器。
有些编译器搜索源代码所在⽬录,有些则搜索当前⽬录,还有些搜索⼯程⽂件所在⽬录。
当出现此类问题时,我们最好注意⾃⼰所⽤的编译器是如何操作的。
在下⾯说明了gcc是如何操作的。
同时,include也可以采⽤相对路径。
⽐如,a.c需要/usr/local/include/Tleap/leap.h,⽽/usr/local/include是系统的默认搜索路径,所以在a.c中可以⽤相对路径包含, #include<Tleap/leap.h>。
对于系统头⽂件,很多IDE具有标准搜索路径,IDE提供菜单选项⽤于指定使⽤尖括号时搜索的路径。
查看GCC的搜索⽬录:(gcc --help) 查看编译c++⽂件使⽤的头⽂件⽬录的命令为:`gcc -print-prog-name=cc1plus` -v 查看编译c⽂件的头⽂件搜索⽬录的命令为 `gcc -print-prog-name=cc1` -vgcc寻找头⽂件的路径: 1.在gcc编译源⽂件的时候,通过参数 -I 指定头⽂件的搜索路径,如果指定路径有多个路径时,则按照指定路径的顺序搜索头⽂件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux下gcc编译中关于头文件与库文件搜索路径相关问题(2011-05-11 15:27:50)如何指定gcc的默认头文件路径在交叉编译的时候我们需要用到其他的库,在config 时候可以通过“-I” 来指定头文件目录,但是每次都需要设置的话难免有些麻烦,找到一个简单的方法。
看下文的红色部分。
有大量的环境变量可供设置以影响GCC 编译程序的方式。
利用这些变量的控制也可使用合适的命令行选项。
一些环境变量设置在目录名列表中。
这些名字和PATH 环境变量使用的格式相同。
特殊字符PATH_SEPARATOR (安装编译程序的时候定义)用在目录名之间。
在UNIX 系统中,分隔符是冒号,而Windows 系统中为分号。
C_INCLUDE_PATH编译C 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-isystem 选项一样。
会首先查找-isystem 指定的所有目录。
==> 也见CPATH 、CPLUS_INCLUDE_PATH 和OBJC_INCLUDE_PATH 。
COMPILER_PATH该环境变量指定一个或多个目录名列表,如果没有指定GCC_EXEC_PREFIX 定位子程序,编译程序会在此查找它的子程序。
==> 也见LIBRARY_PATH 、GCC_EXEC_PREFIX 和-B 命令行选项。
CPATH编译C 、C++ 和Objective-C 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-l 选项一样。
会首先查找-l 指定的所有目录。
==> 也见C_INCLUDE_PATH 、CPLUS_INCLUDE_PATH 和OBJC_INCLUDE_PATH 。
CPLUS_INCLUDE_PATH编译C++ 程序时使用该环境变量。
该环境变量指定一个或多个目录名列表,查找头文件,就好像在命令行中指定-isystem 选项一样。
会首先查找-isystem 指定的所有目录。
==> 也见CPATH 、C_INCLUDE_PATH 和OBJC_INCLUDE_PATH 。
DEPENDENCIES_OUTPUT为文件名设置该环境变量会让预处理程序将基于依赖关系的makefile 规则写入文件。
不会包括系统头文件名字。
如果环境变量设置为单名,被看作是文件名字,而依赖关系规则的名字来自源文件名字。
如果定义中有两个名字,则第二个名字是用作依赖关系规则的目标名。
设置该环境变量的结果和使用命令行选项-MM 、-MF 和-MT 的组合是一样的。
==> 也见SUNPRO_DEPENDENCIES 。
GCC_EXEC_PREFIX如果定义了该环境变量,它会作为编译程序执行的所有子程序名字的前缀。
例如,如果将变量设置为testver 而不是查找as ,汇编器首先会在名字testveras 下查找。
如果在此没有找到,编译程序会继续根据它的普通名进行查找。
可在前缀名中使用斜线指出路径名。
GCC_EXEC_PREFIX 的默认设置为prefix /lib/gcc-lib/ ,这里的prefix是安装编译程序时configure 脚本指定的名字。
该前缀也用于定位标准连接程序文件,包含进来作为可执行程序的一部分。
如果使用-B 命令行选项,会重写该设置。
==> 也见COMPILER_PATH 。
LANG 该环境变量用于指出编译程序使用的字符集,可创建宽字符文字、串文字和注释。
定义LANG 为C-JIS ,指出预处理程序将多字节字符按照JIS (日语工业标准)字符进行解释。
C-SJIS 可用来指出Shift -JIS 字符而C-EUCJP 指出日文EUC 。
如果没有定义LANG ,或定义为不可识别,函数mblen() 被用来确定字符宽度,而mbtowc() 用来将多字节序列转换为宽字符。
LC_ALL 如果设置,该环境变量的值重写LC_MESSAGES 和LC_CTYPE 的所有设置。
LC_CTYPE 该环境变量指出引用串中定义的多字节字符的字符分类。
主要用于确定字符串的字符边界,字符编码需要用引号或转义符,可被错误地解释为字符串的结尾或特殊字符串。
对Australian English ,可将它设置为en_AU ;对Mexican Spanish ,可将它设置为es_MX 。
如果没有设置该变量,默认为LANG 变量的值,或如果没有设置LANG ,那就使用C 英语行为。
也见LC_ALL 。
LC_MESSAGES 该环境变量指出编译程序使用何种语言发出诊断消息。
对Australian English ,可设置为en_AU ;对MexicanSpanish ,可设置为es_MX 。
如果变量没有设置,使用LANG 变量的默认值,或如果没有设置LANG ,那就使用C 英语行为。
也见LC_ALL 。
LD_LIBRARY_PATH 该环境变量不会影响编译程序,但程序运行的时候会有影响。
变量指定一个目录列表,程序会查找该列表定位共享库。
只有当未在编译程序的目录中找到共享库的时候,执行程序必须设置该变量。
LD_RUN_PATH 该环境变量不会影响编译程序,但程序运行的时候会有影响。
该变量在运行时指出文件的名字,运行的程序可由此得到它的符号名字和地址。
地址不会重新载入,因而可能符号引用其他文件中的绝对地址。
这和ld 工具使用-R 选项完全一样。
LIBRARY_PATH该环境变量可设置为一个或多个目录名字列表,连接程序会搜寻该目录,以查找特殊连接程序文件,和由-l (字母l)命令行选项指定名字的库。
由-L 命令行选项指定的目录在环境变量的前面,首先被查找。
==> 也见COMPILER_PATH 。
OBJC_INCLUDE_PATH在编译Objective-C 程序的时候使用该环境变量。
一个或多个目录名的列表由环境变量指定,用来查找头文件,就好像在命令行中指定-isystem 选项一样。
所有由-isystem 选项指定的目录会首先被查找。
==> 也见CPATH 、CPLUS_INCLUDE_PATH 和C_INCLUDE_PATH 。
SUNPRO_OUTPUT为文件名设置该环境变量会令预处理程序将基于依赖关系的makefile 规则写入文件。
会包含系统头文件名。
如果环境变量被设置为单个名字,它将会被当作文件名,依赖关系规则中的名字将由源文件的名字中获得。
如果定义中有两个名字,第二个名字就是依赖关系规则中的目标名。
设置该环境变量的结果与在命令行中使用参数-M 、-MF 和-MT 的效果一样。
==> 参见DEPENDENCIES_OUTPUT 。
TMPDIR这个变量包含了供编译程序存放临时工作文件的目录的路径名。
这些文件通常在编译过程结束时被删除。
这种文件的一个例子就是由预处理程序输出并输入给编译程序的文件。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Linux 指定动态库路径众所周知,Linux 动态库的默认搜索路径是/lib 和/usr/lib 。
动态库被创建后,一般都复制到这两个目录中。
当程序执行时需要某动态库,并且该动态库还未加载到内存中,则系统会自动到这两个默认搜索路径中去查找相应的动态库文件,然后加载该文件到内存中,这样程序就可以使用该动态库中的函数,以及该动态库的其它资源了。
在Linux 中,动态库的搜索路径除了默认的搜索路径外,还可以通过以下三种方法来指定。
方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。
可以通过编辑配置文件/etc/ld.so.conf 来指定动态库的搜索路径,该文件中每行为一个动态库搜索路径。
每次编辑完该文件后,都必须运行命令ldconfig使修改后的配置生效。
我们通过例1 来说明该方法。
例1 :我们通过以下命令用源程序pos_conf.c (见程序1 )来创建动态库libpos.so ,详细创建过程请参考文[1] 。
# gcc -c pos_conf.c# gcc -shared -fPCI -o libpos.so pos_conf.o##include <stdio.h>void pos(){printf("/root/test/conf/lib\n");}程序1: pos_conf.c接着通过以下命令编译main.c (见程序2 )生成目标程序pos 。
# gcc -o pos main.c -L. -lpos#void pos();int main(){pos();return 0;}程序2: main.c然后把库文件移动到目录/root/test/conf/lib 中。
# mkdir -p /root/test/conf/lib# mv libpos.so /root/test/conf/lib#最后编辑配置文件/etc/ld.so.conf ,在该文件中追加一行"/root/test/conf/lib" 。
运行程序pos 试试。
# ./pos./pos: error while loading shared libraries: libpos.so: cannot open shared object file: No such file or directory#出错了,系统未找到动态库libpos.so 。
找找原因,原来在编辑完配置文件/etc/ld.so.conf 后,没有运行命令ldconfig ,所以刚才的修改还未生效。
我们运行ldconfig 后再试试。
# ldconfig# ./pos/root/test/conf/lib#程序pos 运行成功,并且打印出正确结果。
方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。
通过设定环境变量LD_LIBRARY_PATH 也可以指定动态库搜索路径。
当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号" :" 分隔。
下面通过例2 来说明本方法。
例2 :我们通过以下命令用源程序pos_env.c (见程序 3 )来创建动态库libpos.so 。
# gcc -c pos_env.c# gcc -shared -fPCI -o libpos.so pos_env.o##include <stdio.h>void pos(){printf("/root/test/env/lib\n");}程序3: pos_env.c测试用的可执行文件pos 可以使用例1 中的得到的目标程序pos ,不需要再次编译。