g++ -v g++ --version gcc和g++的区别 gcc和g++ 都是GNU (组织)的一个编译器。...■ 「误区一」: gcc只能编译c代码,g++只能编译c++代码。...gcc, 对于C++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了 ,这就给人一种错觉,好像 cpp 程序只能用...gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接,但在编译阶段,g++会自动调用gcc,二者等价. gcc编译过程 ?...结果发现libcalc.so => not found找不到了 「那么如何让程序找到依赖库呢?
本教程教你怎么解决Linux软件编译时遇到的问题 注意:编译安装一个软件不会被系统的包管理系统记录信息,这对于卸载和记录软件的行为都是不利的,建议您尽量使用打包好的包(.rpm .deb) 我们分3类错...如果您不知道怎么办,待回看一下下Make install错误的第一点 记:如果您没有修改ld.conf文件的权限,您还可以将库文件路径添加到LD_LIBRARY_PATH变量中。...当然这是个笨方法,也不是最好的方法,但是当你没有其他选择时,你只好这么做了: export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/your/library/directory...注意当您运行编译好的软件时,LD_LIBRARY_PATH必须包含您的库文件夹路径 2。...尝试获得最新版的软件(使用CVS或者SVN或者源,或者下载每日快照)并且常识编译查看时候他们已经修复了bug。 make报的错还可能由特定库/程序的错误版本造成的。
这里只安装了c和c++的编译器。(如果不指定编译的语言,则会在make时不通过,爆出某些文件找不到等错误,所以还是建议在此指定编译语言为c,c++)然后开始make编译。...为保险起见,需要在环境变量LD_LIBRARY_PATH添加前面三个库的位置,键入以下命令: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc...-0.8.1/lib:/usr/local/gmp-5.0.1/lib:/usr/local/mpfr-2.4.2/lib 然后重新make编译,在经过漫长的1小时等待后,终于编译完成。...在正式使用之前还有最后一个工作要做,就是将前面安装的三个库的路径加进环境变量LD_LIBRARY_PATH中,不然在编译程序的时候会出错。.../lib:/usr/local/gcc-4.5.0/lib export LD_LIBRARY_PATH 保存重启系统后,就可以使用新装的gcc了。
使用ldd显示的so,并不是所有so都是需要使用的,下面举个例子: main.cpp ? 使用缺省参数编译结果 ? 如果我链接一些so,但是程序并不用到这些so,又是什么情况呢?...先使用 ldd -u demo 查看不需要链接的so,看下面,一面了然,无用的so全部暴露出来了吧 ? 使用 -Wl,--as-needed 编译选项 ?...一般人使用方法是修改LD_LIBRARY_PATH这个环境变量 export LD_LIBRARY_PATH=/tmp [stevenrao]$ ....像前面提到的 -L/tmp/是属于链接时期的搜索路径,即给ld程序提供的编译链接时候寻找动态库路径;而LD_LIBRARY_PATH则既属于链接期搜索路径,又属于运行时期的搜索路径。...这里需要介绍链-rpath链接选项,它是指定运行时候都使用的搜索路径。聪明的同学马上就想到,运行时搜索路径,那它记录在哪儿呢。也像LD_LIBRARY_PATH那样,每部署一台机器就需要配一下吗。
通过shared和fPIC编译参数生产so动态链接库文件。程序在调用库函数时,只需要连接上这个库即可。...: final link failed: Bad value collect2: error: ld returned 1 exit status 这说明不是所有的.o文件都能编译成为动态链接库,...需要在.o文件生成时加参数-fPIC gcc -c sum.c -fPIC -o sum.o gcc sum.o -o shared sum.so 一般,共享库的编译命令为(曾经的实验) 动态链接库...-lxx 这时候再 g++ -o main main.c sum.so ....这时候需要 export $LD_LIBRARY_PATH=pwd:$LD_LIBRARY_PATH 注意:-fPIC是生成.o时使用,-shared是用来生成动态链接库的 以上就是本文的全部内容,
二、静态库链接时搜索路径的顺序: 1. ld会去找gcc/g++命令中的参数-L; 2....编译目标代码时指定的动态库搜索路径; 2....环境变量LD_LIBRARY_PATH指定动态库搜索路径,它指定程序动态链接库文件搜索路径; export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:data/home...LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径 六、库的依赖问题: 比如我们有一个基础库libbase.a,还有一个依赖libbase.a编译的库,叫做libchild.a...一、静态库解析符号引用: 链接器ld是如何使用静态库来解析引用的。在符号解析阶段,链接器从左至右,依次扫描可重定位目标文件(*.o)和静态库(*.a)。
一、编译可执行文件 g++ –c Hello.cpp 编译文件,生成目标文件Hello.o g++ Hello.o –o a.out 链接并重命名为可执行文件...指定链接库的路径 -l library -llibrary 指定链接库 (4) -g 在编译的时候,产生调试信息,程序运行时可以...-fPIC -shared hello.cpp -o libmyhello.so (5)使用动态库 动态库的时候和静态库使用一样,唯一值得注意的是当目录中同时存在相同名称的动态库和静态库时...,编译的时候优先使用动态库 2、fPIC选项 加上fPIC选项生成的动态库时位置无关的,可以实现多个进程共享动态库,多个进程引用同一个PIC动态库时,可以共享内存。...export LD_LIBRARY_PATH=./ 取消设置 export LD_LIBRARY_PATH= (3)/etc/ld.so.cache中缓存了动态库路径
注意动态库中生成 .o 文件时gcc 要带选项 -fPIC ,表示生成位置无关码。...四.动静态库的使用 我们先在 main.cpp 文件中使用一下静态库 #include "print.h" //静态库中的头文件 int main() { print_func(); //...其实 gcc 默认是在系统路径下查找的,而我们包含的头文件并不在系统路径中,如何解决?...LD_LIBRARY_PATH中 LD_LIBRARY_PATH 是系统提供用户层的搜索路径,一般情况下,你的电脑上可能没有设置,如果你配置过vim,那么会有如下信息: export LD_LIBRARY_PATH...=$LD_LIBRARY_PATH:(库文件的路径) 4.
/lib export LD_LIBRARY_PATH 但是,有不少声音主张要避免使用 LD_LIBRARY_PATH 变量,尤其是作为全局变量。...那也可以,就是export一个全局变 量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找library。一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。...4. ldconfig做的这些东西都与运行程序时有关,跟编译时一点关系都没有。编译的时候还是该加-L就得加,不要混淆了。 5....<<endl; } return 0; } 编译使用 g++ test.pb.h test.pb.cc write.cc -o write -lprotobuf -...g++ test.pb.h test.pb.cc read.cc -o read -lprotobuf -lpthread 成功 写的有点糙,不过主要是编译这下折腾了好几天,终于通过了
即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。 动态库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。...:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径...so文件,这时你要做的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。...在linux下可以用export命令来设置这个值,在linux终端下输入: export LD_LIBRARY_PATH=/opt/au1200_rm/build_tools/bin: $LD_LIBRARY_PATH...例如:LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/au1200_rm/build_tools/bin。
GCC在链接时优先使用动态库,只有当动态库不存在时才开始使用静态库,如果要强制使用静态库,编译时加上-static参数。 使用-Wl,-Bstatic告诉链接器优先使用静态库。...有关的环境变量: LIBRARY_PATH:使用于编译期间,目标程序链接时搜索动态库的路径。 LD_LIBRARY_PATH:使用于目标程序生成后,目标程序运行时搜索动态库的路径。...静态库链接时,搜索库文件路径的顺序: 1. ld会去找GCC命令中的参数-L 2. gcc的环境变量LIBRARY_PATH 3....编译目标代码时指定的动态库搜索路径 2. gcc的环境变量LD_LIBRARY_PATH 3. 配置文件/etc/ld.so.conf中指定的动态库搜索路径 4. 默认的动态库搜索路径/lib 5....main程序的子程序代码 -v #打印gcc编译时的详细步骤信息 编译和路径参数 -l[basic library] #编译时指定要使用的基础库,样例:-lpthread,针对Posix线程共享库进行编译
在Ubuntu 12.04 LTS 64位下编译安装Erlang R16B02。 1....由于编译Erlang的过程中需要用到java,所以先安装JDK并配置相应环境变量,在此使用jdk-6u43-linux-x64.bin export JAVA_HOME=/usr/local...安装Erlang依赖包 apt-get install g++ build-essential libncurses5-dev libgl1-mesa-dev libglu1-mesa-dev.../stc make && make install 最后配置wxWidgets库路径 echo /usr/local/lib > /etc/ld.so.conf.d...最后再重新配置编译Erlang .
简介 Linux环境下c++代码打包成so Linux环境下so库的使用 这里还是使用我们之前的Socket示例的代码: ?...sockUseLib 项目如何使用so 先说明两个项目都在/code目录下。...在前面gcc编译参数中我们讲到-I指的是头文件的搜索目录,-L是动态库的搜索目录。 这里我们就成功的进行了编译。 然后运行./main发现报错 ....这里有几个方法: 临时修改环境变量 只对当前的shell有效 export LD_LIBRARY_PATH=/code/socketLib 关于LD_LIBRARY_PATH可参考Linux环境变量...修改用户环境变量 只对当前用户有效 将export LD_LIBRARY_PATH=/code/socketLib添加到~/.bashrc的末尾。
在 Linux 下使用 C++ 创建和使用动态库(通常是 .so 文件,即 Shared Object)包含几个关键步骤:创建动态库、编译、链接,以及在应用程序中使用这个库。...编译动态库 使用 g++(GNU C++ 编译器)来编译代码为动态库。使用 -fPIC(Position Independent Code)选项来生成与位置无关的代码,这是创建共享库所必需的。...编译程序并链接动态库 编译这个程序并链接到你的动态库。你需要指定库的位置(如果它不在标准路径中): g++ -o main main.cpp -L. -lhello 这里,-L....运行程序 在运行程序之前,你可能需要设置 LD_LIBRARY_PATH 环境变量以包含你的库文件,特别是当它不在标准库路径中时: export LD_LIBRARY_PATH=....:$LD_LIBRARY_PATH ./main 这告诉运行时链接器在当前目录中查找动态库。 注意事项 确保动态库在程序运行时可用,否则程序将无法启动。
前面说了start-group和end-group是ld的选项,是链接选项,不是gcc/g++的编译选项,直接命令行或其它编译方式也可以使用,比如命令行方式: g++ -g -o x x.cpp -Wl...,这个在使用静态库时需要注意,否则会报符号找不到问题。...另外,在编译libb.a时是不指定liba.a的,因为编译一个静态库不会使用到链接选项,而只需要指定需要依赖的头文件路径即可。...链接时指定共享库的搜索路径(类似于设置LD_LIBRARY_PATH): -Wl,-rpath=/usr/local/abc:/data/abc 以上也可以分开写: -Wl,-rpath=/usr/local... b.o x.o x 使用上面的Makefile编译,将会遇到如下所示的“undefined reference”问题: g++ -g -c x.cpp g++ -g -c a.cpp g++ -
-l[library] 指定编译的时使用的库,例子用法 gcc -lcurses hello.c 使用curses库编译连接,生成程序。...-w 关闭所有警告,建议不要使用此项。 (6)调试选项 -g 指示编译器,在编译时,产生调试信息。...遇到GCC无法识别的编译指导指令,发出警告。在使用了-Wall选项时,就不需要使用该命令选项了。...4.2链接注意事项 4.2.1指定静态与动态的链接方式 g++链接库时,默认优先链接动态链接库。静态库与动态库混合链接时,有如下两种方法: (1)静态链接库使用绝对路径,动态链接库使用-l。.... ---- 参考文献 [1]gcc及其选项详解 [2]GCC官方手册 [3]gcc编译选项 [4]gcc/g++ 静态动态库混链接 [5]折腾gcc/g++链接时.o文件及库的顺序问题
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gmp-5.0.2/lib:/usr/local/mpfr-3.0.1/lib:/usr/local.../mpc-0.9/lib/ echo $LD_LIBRARY_PATH make 此处源码编译的时间约为1个小时(我是在服务器上编译的,你如果用小本本编译就得等等了)...GCC46_HOME/lib64:$GCC46_HOME/lib:$GCC46_HOME/lib/gcc/x86_64- unknown-linux-gnu/4.6.0 export LD_LIBRARY_PATH...1小时多4分钟左右,感觉编译效率上相比之前版本的编译器没有任何提高。...0.9/lib:$GCC46_HOME/lib64:$GCC46_HOME/lib:$GCC46_HOME/lib/gcc/x86_64-unknown-linux-gnu/4.6.1 export LD_LIBRARY_PATH
在Linux下,共享库的加载是由/lib/ld.so完成的,ld.so加载共享库时,会从ld.so.cache查找。 创建函数库示例 我们通常把一些公用函数制作成函数库,供其它程序使用。...本节主要通过举例来说明如何在Linux中创建静态库和动态库,以及使用它们。 在创建函数库前,我们先来准备举例用的源程序,并将函数库的源程序编译成.o文件。...step4:在程序中使用静态库 静态库制作完了,如何使用它内部的函数呢?...动态链接时、执行时搜索路径顺序: 1. 编译目标代码时指定的动态库搜索路径 2. 环境变量LD_LIBRARY_PATH指定的动态库搜索路径 3....:XXXX 3.LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径 export LD_LIBRARY_PATH=LD_LIBRARY_PATH:XXXX 另 从上述可知,如何找到生成的动态库有
,我们想要使用这个静态库,该如何使用呢?...第一种方式使用静态库:编译时手动指定 gcc/g++编译选项 含义 -L 指定库所在的路径 -I(大写i) 指定头文件所在路径 -l(小写L) 指定库名称(去掉前后缀) 如下,假如我要使用这个静态库,...我先将这个压缩包解压: 接下来我们进行g++编译,这里编译时我们手动指定所需要的库名(-l)、库路径(-L)、头文件路径(-I)。...对于静态库的使用,还有第二种方法如下: 第二种方式使用静态库:将头文件以及库文件安装在系统目录 由于gcc/g++在编译时,会默认去系统目录搜索,进行路径匹配,这也是为什么我们平常用c/c++标准库时,...2、将库路径导入环境变量LD_LIBRARY_PATH中 用export指令,将库路径(绝对路径)导入环境变量LD_LIBRARY_PATH中,如下: export LD_LIBRARY_PATH=$LD_LIBRARY_PATH
,有的UNIX版本C语言编译器默认带上了PIC标准.创建最终动态库的方法一般采用C语言编译器的-G或者-shared选项,或者直接使用工具ld创建。...:表示要连接的库在当前目录中 -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称 LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径...当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了...隐式调用动态库和静态库使用方法一致,使用静态库和使用动态库编译成目标程序使用的gcc命令完全一样,那当静态库和动态库同名时,gcc命令会使用哪个库文件呢?...通过测试可以发现,当静态库和动态库同名时, gcc命令将优先使用动态库.为了确保使用的是静态库, 编译时可以加上 -static 选项,因此多第三方程序为了确保在没有相应动态库时运行正常,喜欢在编译最后应用程序时加入
领取专属 10元无门槛券
手把手带您无忧上云