libtool編譯
① 如何編譯OpenWrt
搭建編譯環境。編譯建議在linux下進行。我的系統是Linux mint 17,執行以下命令,構建編譯環境:
sudo apt-get update
sudo apt-get install git-core build-essential
獲取openwrt源碼。在當前用戶主目錄下執行
git clone git://git.openwrt.org/openwrt.git
等待代碼下載。結束後,目錄下會出現openwrt文件夾。
配置軟體源。進入openwrt目錄,執行
./scripts/feeds update -a
./scripts/feeds install -a
檢查編譯環境是否完整:
make defconfig
make prereq
根據提示信息安裝需要的軟體包。如果提示類似
「tmp/.config-package.in:22022:warning: multi-line strings not supported」
的信息,打開 openwrt/tmp/.config-package.in,定位到對應行,添上丟掉的一個引號就可以了。
編譯選項:
執行 make menuconfig,根據路由器情況,選擇 Target System 和 Subtarget。如意雲一代和極壹S的 Target System 均為 Ralink RT288x/RT3xxx 。對於Subtarget ,前者為 MT7620n based boards ,後者為 MT7620a based boards。
其他選項根據個人喜好選擇。一般來說要選中LuCI界面,選中中文語言包等等。
開始編譯:
執行 make -j2 V=s 進行編譯。-j後面的數字是電腦物理CPU數量加一。V=s可以顯示出編譯的詳細信息。首次編譯大概需要幾個小時的時間。
錯誤排查:
編譯失敗,一般有兩種情況:
1.代碼下載鏈接失效。首次編譯時,編譯程序會實時從網上下載一些軟體包的代碼。如果下載鏈接失效,編譯就會失敗。這時需要根據軟體包的名稱,從網上自行下載,然後放在 openwrt/dl/ 目錄下,執行 make -j2 V=s 繼續編譯即可。
2.軟體包自身有問題。這時重新執行 make menuconfig ,取消對應軟體包選中即可。這種情況比較少見,目前已知的有 tor 等。
編譯成功,但沒有生成固件。這種情況一般是因為選中的軟體包過多,導致固件大小超過16MB。重新執行 make menuconfig,去掉一些軟體包,重新執行編譯即可。
得到固件。在排除了所有錯誤後,現在終於得到了固件。對於如意雲RY-1,固件在 openwrt/bin/ramips 目錄下,形如
openwrt-ramips-mt7620n-rt-n14u-squashfs-sysupgrade.bin
openwrt-ramips-mt7620n-wrtnode-squashfs-sysupgrade.bin
openwrt-ramips-mt7620n-mlw221-squashfs-sysupgrade.bin
openwrt-ramips-mt7620n-wr8305rt-squashfs-sysupgrade.bin
等等。
② 怎麼編譯安裝nginx1.8.1
要編譯安裝Nginx,首先我們要安裝依賴包 pcre-devel 和 zlib-devel:
# yum install pcre-devel zlib-devel -y
程序默認是使用 nobody 身份運行的,我們建議使用 nginx 用戶來運行,首先添加Nginx組和用戶,不創建家目錄,不允許登陸系統
# groupadd nginx
# useradd -M -s /sbin/nologin -g nginx nginx
准備工作完成後就是下載編譯安裝Nginx了,可以從我提供的網盤下載,也可以去Nginx的官網下載。
首先解壓源碼包:
# tar xf nginx-1.4.4.tar.gz
然後 cd 到解壓後的目錄就可以執行 ./configure 了
# cd nginx-1.4.4
指定安裝目錄和運行時用的屬主和屬組,並啟用狀態監控模塊等
# ./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--user=nginx \
--group=nginx \
--with-http_ssl_mole \
--with-http_flv_mole \
--with-http_stub_status_mole \
--with-http_gzip_static_mole \
--http-client-body-temp-path=/var/tmp/nginx/client/ \
--http-proxy-temp-path=/var/tmp/nginx/proxy/ \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
--http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
--http-scgi-temp-path=/var/tmp/nginx/scgi \
--with-pcre
等配置完成後就可以 make && make install 了
# make && make install
# mkdir /var/tmp/nginx/client/ -pv
等編譯安裝完成後在 /usr/local 下就會出現 Nginx 這個目錄了,進入這個目錄後發現目錄非常簡單。它的配置文件存放在 conf 目錄中,網頁文件存放在 html 中,日誌文件存放在 logs 中,sbin 目錄下只有一個可執行程序 "nginx"
接下來我們簡單的為它提供一個服務腳本吧!
# vim /etc/init.d/nginx
新建文件/etc/rc.d/init.d/nginx,內容如下:
#!/bin/bash
# chkconfig:235 85 15
# description: Nginx is an HTTP server
. /etc/rc.d/init.d/functions
start() {
echo "Start..."
/usr/local/nginx/sbin/nginx &> /dev/null
if [ $? -eq 0 ];then
echo "Start successful!"
else
echo "Start failed!"
fi
}
stop() {
if killproc nginx -QUIT ;then
echo "Stopping..."
fi
}
restart() {
stop
sleep 1
start
}
reload() {
killproc nginx -HUP
echo "Reloading..."
}
configtest() {
/usr/local/nginx/sbin/nginx -t
}
case $1 in
start)
start ;;
stop)
stop ;;
restart)
restart ;;
reload)
reload ;;
configtest)
configtest ;;
*)
echo "Usage: nginx {start|stop|restart|reload|configtest}"
;;
esac
之後給這個文件可執行許可權:
# chmod +x /etc/init.d/nginx
好了,現在可以使用 start,stop 這些參數控制Nginx服務了
由於腳本是我自己寫的,還有許多不盡人意的地方,歡迎大家修改和完善!
現在我們就試試啟動服務看看效果吧:
# service nginx start
記得關閉 SElinux 和 iptables 防火牆哦,
# service iptables stop
# setenforce 0
接下來就在瀏覽器中訪問你服務的IP看看效果吧!是不是出項了歡迎的字樣呢
接下來就研究下 Nginx 的配置文件吧!
# vim /usr/local/nginx/conf/nginx.conf
各項參數的意義如下:
worker_processes 1; 工作進程數量
error_log logs/error.log; 日誌文件位置
pid logs/nginx.pid; pid文件位置
worker_connections 1024; 沒進程的連接數
listen 80; 監聽埠
server_name localhost; 主機名
root html; 網站根目錄
index index.html index.htm; 網站索引頁
error_page 500 502 503 504 /50x.html; 訪問錯誤頁面
剩下的其他被注釋掉的代碼塊:
location ~ \.php$ { . . . . . . } 對PHP的支持,需要安裝PHP
server { . . . . . . } 添加server代碼塊能添加虛擬主機
剩下還有監聽443埠的超文本傳輸安全協議 HTTPS server 需要在編譯Nginx時添加ssl的支持
接下來我們試著添加一台虛擬主機吧,虛擬主機的添加可以基於埠,可以基於IP,也可以基於主機名,我們挨個來看看:
基於埠:
首先編輯配置文件,添加server代碼塊,記得要寫到http{ . . . . . . }這個大的代碼塊中。
server {
listen 8080;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
這樣就添加了一個監聽8080埠的服務,你也可以定義自己喜歡的埠哦。
接下來檢查下配置文件有沒有問題,如果最後一個單詞顯示successful就代表沒問題了,可以重新啟動Nginx了
# service nginx configtest
# service nginx restart
接下來就給第二個虛擬主機寫一個index吧!首先創建目錄
# mkdir -pv /var/www/html
# echo '<h1>Hi! This is 8080!</h1>' > /var/www/html/index.html
好了 接下來試著在瀏覽器中訪問訪問,記得第二個主機要加上埠訪問哦
現在試著用不同的IP建立虛擬主機吧!我們可以在一塊網卡上綁定多個IP地址的方式來實現
# ifconfig eth0:0 10.0.0.4/8
記得把IP換成你自己的哦!然後ifconfig看看是不是多出來一個網卡IP了呢
讓後繼續修改配置文件,這回要修改兩個地方,一個是原本自帶的站點的 listen 項,一個是自己添加的站點的 listen 項。
基於IP:
server {
listen 10.0.0.3:80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 10.0.0.4:80;
server_name localhost;
location / {
root /var/www/html;
index index.html index.htm;
}
}
讓他們只監聽不同的IP,用相同的埠
接下來再瀏覽器上用不同的IP來訪問試試吧,及的還得重啟Nginx,先檢查一下,出現錯誤了看看哪裡配置的不對,然後就可以重啟了。
# service nginx congiftest
# service nginx restart
如果配置給網卡的第二個IP不想要了,把它停掉就可以了
# ifconfig eth0:0 down
再 ifconfig 看看是不是沒有了呢
現在試試用不同的主機名吧!也是企業用的最多的方式。我們把兩個站點的listen項都改為80,然後修改service_name項為定義的主機名
基於主機名:
server {
listen 80;
server_name ybmq.com;
location / {
root html;
index index.html index.htm;
}
}
server {
listen 80;
server_name zhzz.com;
location / {
root /var/www/html;
index index.html index.htm;
}
}
然後重啟Nginx吧!
可是我們在瀏覽器上怎麼通過域名訪問呢?要知道我們訪問 啊,qq 啊之類的是通過DNS伺服器的,難道我們還要配置一台DNS伺服器?其實不然,我們通過修改客戶機的 hosts 文件就可以了。hosts文件是一個本地的域名解析文件,我們要解析哪些域名只要把域名和對應的IP寫到一起就可以了。在Windows XP之後的系統中,這個文件位於:
C:\Windows\System32\drivers\etc\hosts
我們用文本編輯器打開,添加兩個相同的IP對應的兩個不同的主機名就可以了。
如下圖所示
如果你打開這個文件發現已經有很多IP地址了,可以直接在最後加入這兩行,也可以直接清空這個文件,不會有什麼問題的。這個文件的用途還可以屏蔽一些網站哦,只需要把網址對於的IP改為 127.0.0.1 也就是本地回環地址,瀏覽器查詢域名對應的IP時時先通過查詢這個文件的,如果查詢到了,不管對錯都不會訪問DNS伺服器了,所以我們給它一個錯誤的地址,那它一輩子也打不開被屏蔽掉的網站了。
好了 接下來就在瀏覽器中試試用用域名訪問你的兩個站點吧。
如果大家還用IP訪問會是什麼情況呢?我不說了,大家還是自己測試吧 哈哈o(^▽^)o
③ 怎麼修改libtool編譯動態庫的名字
第一步,我先從簡單的調用出發,定義了一個簡單的函數,該函數僅僅實現一個整數加法求和:
LIBEXPORT_API int mySum(int a,int b){ return a+b;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a,int b);
}
在C#中調用測試:
int iSum = RefComm.mySum(,);
運答仔行查看結果iSum為5,調清信汪用正確。第一步試驗完成,說明在C#中能夠調用自定義的動態鏈接庫函數。
第二步,我定義了字元串操作的函數(簡單起見,還是採用前面的函數名),返回結果為字元串:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a); return a;}
C# 導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", strDest);
運坦空行查看結果 strTmp 為"45",但是strDest為空。我修改動態鏈接庫實現,返回結果為串b:
LIBEXPORT_API char *mySum(char *a,char *b){sprintf(b,"%s",a) return b;}
修改 C# 導入定義,將串b修改為ref方式:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Auto,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm.mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均不對,含不可見字元。再修改 C# 導入定義,將CharSet從Auto修改為Ansi:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, string b);
}
在C#中再調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 為"45",但是串 strDest 沒有賦值。第二步實現函數返回串,但是在函數出口參數中沒能進行輸出。再次修改 C# 導入定義,將串b修改為引用(ref):
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
運行時調用失敗,不能繼續執行。
第三步,修改動態鏈接庫實現,將b修改為雙重指針:
LIBEXPORT_API char *mySum(char *a,char **b){sprintf((*b),"%s",a); return *b;}
C#導入定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern string mySum (string a, ref string b);
}
在C#中調用測試:
string strDest="";
string strTmp= RefComm. mySum("45", ref strDest);
運行查看結果 strTmp 和 strDest 均為"45",調用正確。第三步實現了函數出口參數正確輸出結果。
第四步,修改動態鏈接庫實現,實現整數參數的輸出:
LIBEXPORT_API int mySum(int a,int b,int *c){ *c=a+b; return *c;}
C#導入的定義:
public class RefComm
{
[DllImport("LibEncrypt.dll",
EntryPoint=" mySum ",
CharSet=CharSet.Ansi,CallingConvention=CallingConvention.StdCall)]
public static extern int mySum (int a, int b,ref int c);
}
在C#中調用測試:
int c=0;
int iSum= RefComm. mySum(,, ref c);
運行查看結果iSum 和c均為5,調用正確。
經過以上幾個步驟的試驗,基本掌握了如何定義動態庫函數以及如何在 C# 定義導入,有此基礎,很快我實現了變長加密函數在 C# 中的調用,至此目標實現。
三、結論
在 C# 中調用 C++ 編寫的動態鏈接庫函數,如果需要出口參數輸出,則需要使用指針,對於字元串,則需要使用雙重指針,對於 C# 的導入定義,則需要使用引用(ref)定義。
對於函數返回值,C# 導入定義和 C++ 動態庫函數聲明定義需要保持一致,否則會出現函數調用失敗。定義導入時,一定注意 CharSet 和 CallingConvention 參數,否則導致調用失敗或結果異常。運行時,動態鏈接庫放在 C# 程序的目錄下即可,我這里是一個 C# 的動態鏈接庫,兩個動態鏈接庫就在同一個目錄下運行。
④ linux下的so,o,lo,a,la文件有什麼區別
o: 編譯的目標文件
a: 靜態庫,其實就是把若干o文件打了個包
so: 動態鏈接庫(共享庫)
lo: 使用libtool編譯出的目標文件,其實就是在o文件中添加了一些信息
la: 使用libtool編譯出的庫文件,其實是個文本文件,記錄同名動態庫和靜態庫的相關信息
⑤ 如何編譯OpenWrt
准備工作
在開始編譯Openwrt之前需要您做些准備工作;與其他編譯過程一樣,類似的編譯工具和編譯環境是必不可少的:
一個構建OpenWrt映像的系統平台,簡單說就是准備一個操作系統(比如Ubuntu、Debian等);
確保安裝了所需的依賴關系庫, (在debian系統中就是安裝各種需要的軟體包)
OpenWrt源代碼副本
首先, 開機登陸到支持編譯Openwrt的操作系統(廢話了)。實體機或者虛擬機(Vmware 或者 Qemu)里的操作系統都行,這里推薦使用Linux系統。 bsd和mac osx系統也可以編,但不推薦,且未驗證是否可編譯成功。下文假定您使用的是Debian操作系統,使用 apt-get 來管理包. 替代的選擇是 Ubuntu (分支 Kubuntu, Xubuntu 等即可)。
第二步, 就是安裝所需要的各種軟體包, 包括編譯器,解壓工具,特定的庫等. 這些工作可以簡單的通過鍵入以下命令 (通常需要root 或者是 sudo 許可權),以root許可權安裝下列軟體包(可能並不完整,會有提示,提示缺少即裝就可以了):
32位(x86)請執行下列命令:
# apt-get install build-essential asciidoc binutils bzip2 gawk gettext \
git libncurses5-dev libz-dev patch unzip zlib1g-dev
64位(x86_64)請執行下列命令(多裝了哪些庫或軟體包呢?請您仔細看一看哦):
# apt-get install build-essential asciidoc binutils bzip2 gawk gettext \
git libncurses5-dev libz-dev patch unzip zlib1g-dev ia32-libs \
lib32gcc1 libc6-dev-i386
參考 本列表中 所列的編譯環境所需要軟體包或庫。
某些依賴的為庫或軟體包也許操作系統中已經安裝過,此時apt-get會作出提示(提示您忽略或重新安裝的),別緊張,放輕鬆些,編譯Openwrt不會像編譯DD-WRT那樣難的(至少本人是體會到了編譯DD-WRT的難)。
最後下載一份完整的 Openwrt 源碼到編譯環境中。關於Openwrt的源代碼下載,途徑有二,一是通過 svn ,一是通過 git,建議使用 svn ,因為Openwrt主要以 svn 來維護Openwrt系統的版本。另外,請注意Openwrt中不同的分支版本,一個是用得較多的開發快照,俗稱 trunk,二是穩定版,俗稱 backfire。
⑥ 如何用 cygwin + libtool 編譯出 VS 可用的 lib/dll
經過努力,發現這個連接的方法,是可以編譯生成libcurl.a文件的。我的方法是將解壓的curl源碼放到ndk根目錄。在cygwin中切換到(ndk目錄)/curl。然後運行./configure命令生成curl_config.h,然後將android.mk中節點LOCAL_CFLAGS+=\$(common_CFLAGS)\-I$(LOCAL_PATH)/include\-I/usr/include補充缺少內容。然後編譯,有好多警告,不過最後還是成功了。
⑦ mac 升級到10.12.1 後導致xcode 無法編譯 libtool找不到 但是我在路徑找了是有的
您好,這個看樣子應該是java軟體,可明源能是版本太低不叢塵適用,請您下載最新版本試試看!如果已是最新版本,您可以把截圖激鄭態發來繼續追問!
linux ubuntu下用C連MySQL接數據mysql資料庫的步驟如下:
1.安裝mysql-server,在Ubuntu10.04下安裝mysql-server-5.1,會自動安裝mysql-client_5.1
sudo apt-get install mysql-server-5.1
2.C APIs包含在mysqlclient庫文件中與MySQL的源代碼一塊發行,用於連接到資料庫和執行資料庫查詢,因此需要安裝libmysqlclient-dev
sudo apt-get install libmysqlclient-dev
假定已安裝成功,相關文件如下:
頭文件在/usr/include/mysql目錄下;
庫文件在/usr/lib/mysql和/usr/lib目錄下
3.啟動和關閉mysql
啟動mysql:sudo start mysql
關閉mysql:sudo stop mysql
使用ps aux |grep mysql 查看mysql啟動狀態
ps命令用於查看當前系統中運行的進程信息,命令格式:ps [選項]
常見參數:
-a 顯示系統中所有進程,包括其他用戶進程
-e 顯示所有進程信息
-f 顯示進程的所有信息
-l 顯示長格式顯示進程的信息
-r 只顯示正在運行的程序
-u 以用戶的格式顯示進程信息
-x 顯示所有終端上的進程信息
最常用的方法是ps aux,然後再利用一個管道符號導向到grep去查找特定的進程,然後再對特定的進程進行操作。例如前面使用的ps aux |grep mysql
4.鏈接庫時需要庫文件,有靜態庫文件,也有動態庫文件,也有名字相同的靜態庫文件和動態庫文件,如何區分:
.o,.a,.so,.lo,.la後綴文件含義
.o: 編譯的目標文件
.a: 靜態庫,其實就是把若干o文件打了個包
.so: 動態鏈接庫(共享庫)
.lo: 使用libtool編譯出的目標文件,其實就是在o文件中添加了一些信息
.la: 使用libtool編譯出的庫文件,其實是個文本文件,記錄同名動態庫和靜態庫的相關信息
la只有在用libtool編譯應用程序或庫時才用,即開發者只指明la文件,至於最終鏈接a還是so由libtool決定,不使用libtool的小程序用不上la。
5.連接MySql
a、連接到本機上的MYSQL:
首先打開終端窗口,再鍵入命令mysql -u root -p,回車後提示你輸密碼,如果剛安裝好MYSQL,超級用戶root是沒有密碼的,故直接回車即可進入
到MYSQL中了,MYSQL的提示符是:mysql>
b.修改密碼,格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
例1:給root加個密碼ab12。首先打開終端窗口,然後鍵入以下命令:mysqladmin -uroot password ab12.(註:因為開始時root沒有密碼,所以-p舊密碼一項就可以省略了)。
例2:再將root的密碼改為djg345。 mysqladmin -uroot -pab12 password djg345 (注:u與root可以不用加空格,其它也一樣)。
c、退出MYSQL命令: exit
6.增加新用戶(注意:和上面不同,下面的因為是MYSQL環境中的命令,所以後面都帶一個分號作為命令結束符)
格式:grant select on 資料庫.* to 用戶名@登錄主機 identified by "密碼"
例1、增加一個用戶test1密碼為abc,讓他可以在任何主機上登錄,並對所有資料庫有查詢、插入、修改、刪除的許可權。
首先用以root用戶連入MYSQL,然後鍵入以下命令:grant select,insert,update,delete privileges on *.* to "test1"@"%" Identified by "abc" with grant option; 但例1增加的用戶是十分危險的,
你想如某個人知道test1的密碼,那麼他就可以在internet上的任何一台電腦上登錄你的mysql資料庫並對你的數據可以為所欲為了,解決辦法見例2。
例2、增加一個用戶test2密碼為abc,讓他只可以在localhost上登錄,並可以對資料庫mydb進行查詢、插入、修改、刪除的操作(localhost指本地主機,即MYSQL資料庫所在的那台主機),
這樣用戶即使用知道test2的密碼,他也無法從internet上直接訪問資料庫,只能通過MYSQL主機上的web頁來訪問了。
grant select,insert,update,delete on mydb.* to test2@localhost identified by 「abc」;如果你不想test2有密碼,可再打一個命令將密碼消掉。
grant select,insert,update,delete on mydb.* to test2@localhost identified by 「」;
例3、遠程登錄:
a、默認情況下Mysql只允許本地登錄,所以需要修改配置文件將地址綁定給注釋掉:
vi /etc/mysql/my.cnf
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address = 127.0.0.1 <---注釋掉這一行就可以遠程登錄了
b、允許遠程登錄後,還應設置遠程登錄許可權:
mysql>grant all privileges on *.* to "root"@"%" identified by "123456" with grant option;
c、使修改生效:
mysql> flush privileges;
d、在另一台機器上遠程登錄(mysql所在機器地址:192.168.0.30):
mysql -h192.168.0.30 -uroot -p123456
e、如果仍不能登錄,就把遠程mysql關閉,之後重啟
sudo stop mysql
sudo start mysql
7.顯示命令:(註:下面來看看MYSQL中有關資料庫方面的操作。注意:必須首先登錄到MYSQL中,以下操作都是在MYSQL的提示符下進行的,而且每個命令以分號結束)。
a、顯示資料庫列表:show databases; 剛開始時才兩個資料庫:mysql和test。mysql庫很重要它裡面有MYSQL的系統信息,我們改密碼和新增用戶,實際上就是用這個庫進行操作。
b、顯示庫中的數據表:use mysql; show tables;
c、顯示數據表的結構:describe 表名;
d、建庫: create database 庫名;
e、建表: use 庫名; create table 表名 (欄位設定列表);
f、刪庫和刪表: drop database 庫名; drop table 表名;
g、將表中記錄清空:delete from 表名;
h、顯示表中的記錄:select * from 表名;
⑨ linux中的.lo是什麼文件
.lo文件,使用libtool編譯出的目標文件,其實就是在o文件中添加了一些信息
⑩ libtool 生成的.la文件怎麼連接
linux下文件的類型是不依賴於其後綴名的,但一般來講: .ko 是linux 2.6內核使用的動態連接文件的後綴名,也就是模塊文件,用來在linux系統啟動時載入內核模塊 .o 是目標文件,相當於windows中的.obj文件 .so 為共享庫,是shared object,用於動態連接的,和dll差不多 .a 為靜態庫,是好多個.o合在一起,用於靜態連接 .la 為libtool自動生成的一些共享庫,vi編輯查看,主要記錄了一些配置信息。可以用如下命令查看file *.la來查看文件類型 創建.a庫文件和.o庫文件: $ gcc -c mylib.c $ ar -r mylib.a mylib.o 動態鏈接庫*.so的編譯與使用 下面通過一個例子來介紹如何生成一個動態庫。這里有一個頭文件,三個.c文件: so_test.h test_a.c test_b.c test_c.c 我們將這幾個文件編譯成一個動態庫:libtest.so。 代碼 so_test.h: #include <stdio.h> #include <stdlib.h> void test_a(); void test_b(); void test_c(); test_a.c: #include /so_test.h/ void test_a() { printf(/this is in test_a...//n/); } test_b.c: #include /so_test.h/ void test_b() { printf(/this is in test_b...//n/); } test_c.c: #include /so_test.h/ void test_c() { printf(/this is in test_c...//n/); } $ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so 2、動態庫的鏈接 在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這 個庫里的函數。程序的源文件為:test.c。 #include /so_test.h/ int main() { test_a(); test_b(); test_c(); return 0; } 將test.c與動態庫libtest.so鏈接生成執行文件test: $ gcc test.c -L. -ltest -o test 測試是否動態連接,如果列出libtest.so,那麼應該是連接正常了 $ ldd test 這時應該會報找不到libtest.so,這里我們再執行一下: $ sudo cp libtest.so /usr/lib 把這個庫拷貝到系統默認的庫路徑即可,這樣只是臨時測試使用,更合理的方法看後面介紹 執行test,可以看到它是如何調用動態庫中的函數的。 3、編譯參數解析 最主要的是GCC命令行的一個選項: -shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成 弱連接W類型的導出符號),不用該標志外部程序無法連接。相當於一個可執行文件 -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯後纖鋒的代碼是位置相毀如晌關的所以動 態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。 -L.:表示要連接的庫在當前目錄中 -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,後面加上.so來確定庫的名稱 LD_LIBRARY_PATH:這個環境變數指示動態連接器可以裝載動態庫的路徑。 當然如果有root許可權的話,可以修改/etc/ld.so.conf文件,然後調用/sbin/ldconfig來 達到同樣的目的,不過如果沒有root許可權,那麼只能採用輸出LD_LIBRARY_PATH的方法了。 4、注意 調用動態庫的時候有幾橡者個問題會經常碰到,有時,明明已經將庫的頭文件所在目錄 通過 -I include進來了,庫所在文件通過-L參數引導,並指定了-l的庫名,但通過ldd命令察看時, 就是死活找不到你指定鏈接的so文件,這時你 要作的就是通過修改LD_LIBRARY_PATH或 者/etc/ld.so.conf文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題 了。 makefile裡面怎麼正確的編譯和連接生成.so庫文件,然後又是在其他程序的makefile裡面如何編譯 和連接才能調用這個庫文件的函數???? 答: 你需要告訴動態鏈接器、載入器ld.so在哪裡才能找到這個共享庫,可以設置環境變數把庫的 路徑添加到庫目錄/lib和/usr/lib,LD_LIBRARY_PATH=$(pwd),這種方法採用命令行方法不太方便,一種替 代方法 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注釋^^^^^^^^^^^^^^^^^^^^^^^^^^^^ LD_LIBRARY_PATH可以在/etc/profile還是~/.profile還是./bash_profile里設置,或者.bashrc里 , 改完後運行source /etc/profile或. /etc/profile 更好的辦法是添入/etc/ld.so.conf, 然後執行/sbin/ldconfig ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^注釋^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 是把庫路徑添加到/etc/ld.so.conf,然後以root身份運行ldconfig 也可以在連接的時候指定文件路徑和名稱-I -L. GCC=gcc CFLAGS=-Wall -ggdb -fPIC #CFLAGS= all: libfunc test libfunc:func.o func1.o $(GCC) -shared -Wl,-soname,libfunc.so.1 -o libfunc.so.1.1 $< ln -sf libfunc.so.1.1 libfunc.so.1 ln -sf libfunc.so.1 libfunc.so ***********************************************注釋 ************************************************ ln -s是用來創建軟鏈接,也就相當於windows中的快捷方式,在當前目錄中創建上一級目錄中的文件 ttt的命名為ttt2軟鏈接的命令是ln -s ../ttt ttt2,如果原文件也就是ttt文件刪除的話,ttt2也變成了 空文件。 ln -d是用來創建硬鏈接,也就相當於windows中文件的副本,當原文件刪除的時候,並不影響副本 的內容。 編譯目標文件時使用gcc的-fPIC選項,產生與位置無關的代碼並能被載入到任何地址: