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"