64位可以编32位的程序出来,在各种FLAGS中增加 -m32 编出来的就是32位程序,连接时自然是找32位的共享库
这个要看发行版对32位支持的实现,比如gentoo下如果开abi支持双架构那很可能悲剧,因为有些包还没跟上,如信激果用binary的32位库又会因为版本不同出现莫名其妙的问题,比如fontconfig的坑。
伏模我在64位编32位程序都是使用chroot的方法,这样就可以把32位的头文件库什么的全放在某个地方。我用的是ubuntu,32位库和64位库位置不一样,一般可以直接安装32位的库,如果遇到某些比较特殊的库,一般都可缺坦缓以通过重新编译增加rpath解决,如果没源码也可以用patchelf直接给elf上rpath。
2. linux下编译出现warning :ld-linux.so.3,needed by
需要这个动态库libstdc++.so,因为没有找到。
当然也可以加参数帮助编译器找-rpath或者-rpath-link。
还是多学习一下编译器的友团蔽链接的原理。推荐看看bison源代码分析,好州以便写的代码一次性通过。
不至于出现这或返样那样的错误。
3. linux下ld连接SO文件时如何制定绝对路径
连接器使用下面的搜索路径来定位需要的共享库: 1. 所有由"-rpath-link"选项指定的搜索路径. 2. 所有由"-rpath"指定的搜索路径. “-rpath"跟"-rpath_link"的不同之处在于,由"-rpath"指定的路径被包含在可执行文件中,并在运行时使用, 而"-rpath-link"选项仅仅在连接时起作用. 它只用于本地连接器. 3. 在一个ELF系统中, 如果"-rpath"和"rpath-link"选项没有被使用, 会搜索环境变量"LD_RUN_PATH"的内容.它也只对本地连接器起作用. 4. 在SunOS上, “-rpath"选项不使用, 只搜索所有由"-L"指定的目录. 5. 对于一个本地连接器,环境变量"LD_LIBRARY_PATH"的内容被搜索. 6. 对于一个本地ELF连接器,共享库中的`DT_RUNPATH"和`DT_RPATH"操作符会被需要它的共享库搜索. 如果"DT_RUNPATH"存在了, 那"DT_RPATH"就会被忽略. 7. 缺省目录, 常规的,如"/lib"和"/usr/lib". 8. 对于ELF系统上的本地连接器, 如果文件"/etc/ld.so.conf"存在, 这个文件中有的目录会被搜索.
如上所述,可以用"-rpath-link","-rpath",或者文件"/etc/ld.so.conf"来指定。
4. Linux 查看依赖库
1.查看依赖的库:
objmp -x xxx.so | grep NEEDED
2.查看可执察慧宴行程序依赖的库:
objmp -x 可执行程序名败银 | grep NEEDED
3.查看缺少的库:
ldd xxx.so
4.查看库版本编译等信息:
strings xxx.so
-L -rpath -rpath-link 添加碧铅动态库路径
5. 嵌入式linux程序开机自启动时找不到动态库,求各位大神帮忙。。。。
原因是rcS
比/etc/profile先运行,rcS是一耐森开机第一个运行的,这时候你的库还没有被连进来昌判亩冲陪。
建议把./myXX
放在/etc/profile
的末尾。或者在./myXX这前source
/etc/profile.
6. linux中把.c的文件编译成.so
就跟用VS编译dll或者lib文件差不多,把代码编译完成以后,命名为相应的后缀就好了。
例如:
gcc -c -fPIC libst.c
生成 libst.o
然后
gcc -shared -fPIC -o libst.so libst.o
生成 libst.so 动态链接库
把libst.so拷贝到系统默认库目录下,比如 /lib, /usr/lib 下
假定有 test.c 要引用这个库
gcc -lst -o test test.c
然后就可以了
假如不能把libst.so拷贝到默认库目录下,比方说放在了
/home/aaa/lib 下
那么就用这样的语句来编译test.c
gcc -L/home/aaa/lib -lst -Wl,-rpath=/home/aaa/lib -o test test.c
7. 编译时找不到动态库
报错:
分析:
应该是动态库链接的库位置不对,默认在目录usr/lib/ 下查找动态库。
方式一 用ln -s建立创建软连接,确保/usr/lib下存在库。
ln -s /绝对路径/源 /绝对路径/目的
方式二键誉州 编译时使用-rpath 或者-rpath-link,例虚毕如如下gcc编译时设置
mips64el-redhat-linux-gcc -o test *.c -Wall -L./lib/mips64le/ -lpthread -lm -Wl,-rpath=/usr/稿蔽local/gcc-4.8.3-d197-n64-loongson/usr/mips64el-redhat-linux/lib64/
挂载命令的顺序
8. linux编译的c++程序位置
linux系统编神差孙译C++程序时头⽂件和库⽂件搜索路径
C++编译时,教科书中写道:#include “headfile.h”优先在当前⽬录查找头⽂件;#include < headfile.h>从系统默认路径查找头⽂件。先
前以为系统默认路径是环境变量$PATH指定的路径,在系统上⼀查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
全是bin⽬录,$PATH是运⾏可执⾏⽂件时的搜索路径,与include头⽂件的搜索路径⽆关,可能不少⼈犯了我这样的错误。
头⽂件:
1. #include“headfile.h”
搜索顺序为:
①先搜索当前⽬录
②然后搜索-I指定的⽬录
③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH)
④最后搜索gcc的内定⽬录
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
各⽬录存在相同⽂件时,先找到哪个使⽤哪个。
2. #include<headfile.h>
①先搜索-I指定的⽬录
②然后搜索gcc的环境变量CPLUS_INCLUDE_PATH
③最后搜索gcc的内定⽬录
/usr/include
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.1.1/include
与上⾯的相同,各⽬录存在相同⽂件时,先找到哪个使⽤哪游链个。这⾥要注意,#include<>⽅式不会搜索当前⽬录!
这⾥要说下include的内定⽬录,它不是由$PATH环境变量指定的,⽽是由g++的配置prefix指定的(知道它在安装g++时可以指定,不知安
装后如何修改的,可能是修改配置⽂件,需要时再研究下):
-bash-3.2$ g++ -v
Using built-inspecs.
Target:x86_64-redhat-linux
Configured with:../configure --prefix=/usr --mandir=/usr/share/man--infodir=/usr/share/info --enable-shared --enable-threads=posix--enable-checking=release --with-system-zlib --enable-__cxa_atexit--disable-libunwind-exceptions --enable-libgcj-multifile--enable-languages=c,c++,objc,obj-c++,java,fortran,ada--enable-java-awt=gtk --disable-dssi --enable-plugin--with-java-home=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre--with-cpu=generic --host=x86_64-redhat-linux
Thread model:posix
gcc version 4.1.2 20080704(Red Hat 4.1.2-46)
在安装g++时,指定了prefix,那么内定搜索⽬录就是:
Prefix/include
Prefix/local/include
Prefix/lib/gcc/--host/--version/include
编译时可以通过-nostdinc++选项屏蔽对内定⽬录搜索头⽂件。
库⽂件:
编译的时候:
①gcc会去找-L
②再找gcc的环境变量LIBRARY_PATH
③再找内定⽬录/lib /usr/lib/usr/local/lib 这是当初compilegcc时写在程序内的(不可配置的?)
运⾏时动态库的搜索路径:
动态库的搜索路径搜索的先后顺序是:
①编译⽬标代码时指定的动态库搜索路径(庆迹这是通过gcc 的参数"-Wl,-rpath,"指定。当指定多个动态库搜索路径时,路径之间⽤冒号":"分隔)
②环境变量LD_LIBRARY_PATH指定的动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间⽤冒号":"分隔)
③配置⽂件/etc/ld.so.conf中指定的动态库搜索路径;
④默认的动态库搜索路径/lib;
⑤默认的动态库搜索路径/usr/lib。
(应注意动态库搜寻路径并不包括当前⽂件夹,所以当即使可执⾏⽂件和其所需的so⽂件在同⼀⽂件夹,也会出现找不到so的问题,类同#include<header_file>不搜索当前⽬录)
¥
5
网络文库VIP限时优惠现在开通,立享6亿+VIP内容
立即获取
linux系统编译C++程序时头文件和库文件搜索路径
linux系统编译C++程序时头⽂件和库⽂件搜索路径
C++编译时,教科书中写道:#include “headfile.h”优先在当前⽬录查找头⽂件;#include < headfile.h>从系统默认路径查找头⽂件。先
前以为系统默认路径是环境变量$PATH指定的路径,在系统上⼀查,傻了眼:
-bash-3.2$ echo$PATH
/usr/local/bin:/bin:/usr/bin:/sbin:/usr/sbin:/usr/X11R6/bin:/usr/java/j2re1.4.0/bin:/usr/atria/bin:/ccase/bin:/home/devcomp
第 1 页
全是bin⽬录,$PATH是运⾏可执⾏⽂件时的搜索路径,与include头⽂件的搜索路径⽆关,可能不少⼈犯了我这样的错误。
头⽂件:
1. #include“headfile.h”
搜索顺序为:
①先搜索当前⽬录
②然后搜索-I指定的⽬录
③再搜索gcc的环境变量CPLUS_INCLUDE_PATH(C程序使⽤的是C_INCLUDE_PATH)
展开全文
限免
导长图
转存到网盘
发送至微信
下载文档
北京网络网讯科技有限公司 版本号8.0.70
9. 求助,Linux系统安装php,报错!
请用 ./configure 还有就是你那一堆换行连接符 有问题 ,./configure 是autoconf 生成的一个对应不同的环境进行配置的一个shell 文件,如果你还是报错,那么检查你后面with的那一堆php扩展的依赖,一般你with 那么多是安装不过的 。
10. linux centos7.4 php7.1.31安装
yum -y install gcc-c++
groupadd httpd
useradd -g httpd httpd
yum install libxml2 -y
yum install libxml2-devel -y
yum install libcurl-devel -y
yum -y install libjpeg-devel libpng-devel
//字体
yum install freetype-devel -y
yum -y install openssl openssl-devel
yum -y install php-mcrypt limcrypt libmcrypt-devel
tar -zxvf php-7.0.1.tar.gz
./configure --prefix=/usr/local/php --with-iconv --with-zlib --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --enable-ftp --with-jpeg-dir --with-freetype-dir --with-png-dir --enable-fpm --with-fpm-user=httpd --with-fpm-group=httpd --with-pdo-mysql --with-mysqli --with-mcrypt=/usr/local/ --enable-opcache=no
make && make install
配置环境变量
export PATH=$PATH:/usr/local/php/bin
export PATH=$PATH:/usr/local/php/sbin
然后立马生效,执行
source /etc/profile
cp php.ini-proction /usr/local/php/lib/php.ini
cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
修改php.ini
vi /usr/local/php/lib/php.ini
date.timezone = "Asia/Shanghai"