linux默認頭文件會放到/usr/local/include下面 lib放到/usr/local/lib下面
1.下載 boost-1_52 http://sourceforge.net/projects/boost/files/boost/1.52.0/
2. 將文件解壓在/usr/local/目錄下
3. 進入/usr/local/boost-1_52_0/ 目錄, 在terminal中輸入
4.進入/usr/local/boost-1_52_0/ 目錄,在terminal中輸入
5.添加環境變量(剛改完要重啟或者注銷一下來更新剛修改過的環境變量)
1.Boost庫的下載地址:http://sourceforge.net/projects/boost/files/boost/1.44.0/
2.luabind對函數綁定太敏感了,返回值少了一個&就直接罷工了
3.boost::filesystem 1.4 到1.5的時候有了大的變化,應該是支持了unicode,然后坑來了,新版win上默認是unicode所以string返回的是string值類型,而wstring默認返回&類型,這個使用luabind綁定的時候應為模版的原因使用string&綁定string的時候感知不到,直接core down了,,,
關于第三點:vc是能感知到的gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)這個GCC是他倆的感知不到
第一反應是:居然沒有對應的.so 和.a,dll搜索path居然是編譯階段就定好了。
好吧,都是可以控制的
靜態庫:
在linux環境中, 使用ar命令創建靜態庫文件.如下是命令的選項:
d -----從指定的靜態庫文件中刪除文件
m -----把文件移動到指定的靜態庫文件中
p -----把靜態庫文件中指定的文件輸出到標準輸出
q -----快速地把文件追加到靜態庫文件中
r -----把文件插入到靜態庫文件中
t -----顯示靜態庫文件中文件的列表
x -----從靜態庫文件中提取文件
還有多個修飾符修改以上基本選項,詳細請man ar 以下列出三個:
a -----把新的目標文件(*.o)添加到靜態庫文件中現有文件之后
b -----***************************************之前
v -----使用詳細模式 ar 命令的命令行格式如下: ar [-]{dmpqrtx}[abcfilNoPsSuvV] [membername] [count] archive files... eg: ar -crs hello.a hello.c
動態庫 :
庫函數的鏈接載入推遲到程序運行的時期(runtime)。這就是如雷貫耳的動態鏈接庫(dynamic link library)技術。
動態鏈接庫的特點與優勢:
1. 可以實現進程之間的資源共享。
某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些“動態鏈接”額外的開銷,卻大大的節省了系統的內存資源。C的標準庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標準庫的代碼段。
2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級
3. 甚至可以真正做到鏈接載入完全由程序員在程序代碼中控制。
所有的函數本著“有需求才調入”的原則,于是大大節省了系統資源。
動態鏈接庫的創建
由于動態鏈接庫函數的共享特性,它們不會被拷貝到可執行文件中。在編譯的時候,編譯器只會做一些函數名之類的檢查。在程序運行的時候,被調用的動態鏈接庫函數被安置在內存的某個地方,所有調用它的程序將指向這個代碼段。因此,這些代碼必須實用相對地址,而不是絕對地址。在編譯的時候,我們需要告訴編譯器,這些對象文件是用來做動態鏈接庫的,所以要用地址不無關代碼(Position Independent Code (PIC))。
對gcc編譯器,只需添加上 -fPIC 標簽,如:
1.創建共享庫
gcc -fPIC -c error.c
gcc -fPIC -c errorlog.c
gcc -shared -o libapue.so error.o errorlog.o
這樣就創建了共享庫!
注意到最后一行,-shared 標簽告訴編譯器這是要建立動態鏈接庫。這與靜態鏈接庫的建立很不一樣,后者用的是 ar 命令。也注意到,動態鏈接庫的名字形式為 “libxxx.so” 后綴名為 “.so”
2.編譯共享庫
使用動態鏈接庫,首先需要在編譯期間讓編譯器檢查一些語法與定義。
這與靜態庫的實用基本一樣,用的是 -Lpath 和 -lxxx 標簽。如:
gcc file1.o file2.o -Lpath -lxxx -o program.exe
編譯器會先在path文件夾下搜索libxxx.so文件,如果沒有找到,繼續搜索libxxx.a(靜態庫)。
在程序運行期間,也需要告訴系統去哪里找你的動態鏈接庫文件。在UNIX下是通過定義名為 LD_LIBRARY_PATH 的環境變量 來實現的。只需將path賦值給此變量即可。csh 命令為:
setenv LD_LIBRARY_PATH your/full/path/to/dll
一切安排妥當后,你可以用 ldd 命令檢查是否連接正常。
ldd program.exe
如何才能讓動態加載器發現庫文件呢?有兩種方法可以解決:
LD_LIBRARY_PATH 環境變量
/etc/ld.so.conf文件
1.環境變量
export LD_LIBRARY_PATH="dir$LD_LIBRARY_PATH"
2.修改/etc/ld.so.conf文件.位于/etc/ld.so.conf
一般應用程序的庫文件不與系統庫文件放在同一個目錄下,一般把應用程序的共享庫文件放在/usr/local/lib下,新建一個屬于自己的目錄apue,然后把剛才libapue.so復制過去就行了
同時在/etc/ld.so.conf中新增一行:
/usr/local/lib/apue
實例分析:
1、動態庫的編譯
下面通過一個例子來介紹如何生成一個動態庫。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。
so_test.h:
#include
#include
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_a.c:
#include "so_test.h"
void test_c()
{
printf("this is in test_c.../n");
}
將這幾個文件編譯成一個動態庫:libtest.so
$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so
2、動態庫的鏈接
在1、中,我們已經成功生成了一個自己的動態鏈接庫libtest.so,下面我們通過一個程序來調用這個庫里的函數。程序的源文件為:test.c。
test.c:
#include "so_test.h"
int main()
{
test_a();
test_b();
test_c();
return 0;
}
l 將test.c與動態庫libtest.so鏈接生成執行文件test:
$ gcc test.c -L. -ltest -o test
l 測試是否動態連接,如果列出libtest.so,那么應該是連接正常了
$ ldd test
l 執行test,可以看到它是如何調用動態庫中的函數的。
3、編譯參數解析
最主要的是GCC命令行的一個選項:
-shared 該選項指定生成動態連接庫(讓連接器生成T類型的導出符號表,有時候也生成弱連接W類型的導出符號),不用該標志外部程序無法連接。相當于一個可執行文件
l -fPIC:表示編譯為位置獨立的代碼,不用此選項的話編譯后的代碼是位置相關的所以動態載入時是通過代碼拷貝的方式來滿足不同進程的需要,而不能達到真正代碼段共享的目的。
l -L.:表示要連接的庫在當前目錄中
l -ltest:編譯器查找動態連接庫時有隱含的命名規則,即在給出的名字前面加上lib,后面加上.so來確定庫的名稱
l LD_LIBRARY_PATH:這個環境變量指示動態連接器可以裝載動態庫的路徑。
l 當然如果有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文件來指定動態庫的目錄。通常這樣做就可以解決庫無法鏈接的問題了。
3: 如果出現下列錯誤
./test: error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
解決方法:
1: export LD_LIBRARY_PATH=DIR:$LD_LIBRARY_PATH
2: 修改文件/etc/ld.so.config文件,在末行加上你的庫文件目錄,最后,ldconfig刷新ld.so.cache文件即可。可以用strings命令查看ld.so.cache是否刷新:strings /etc/ld.so.cache | grep print
4: ldd命令查看動態連接庫
linux-gate.so.1 => (0xb7f0e000)
libprint.so => not found
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7d82000)
/lib/ld-linux.so.2 (0xb7ef4000)
5 : nm查看程序中有那些符號
049f18 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080485cc R _IO_stdin_used
w _Jv_RegisterClasses
08049f08 d __CTOR_END__
08049f04 d __CTOR_LIST__
08049f10 D __DTOR_END__
08049f0c d __DTOR_LIST__
080485ec r __FRAME_END__
08049f14 d __JCR_END__
08049f14 d __JCR_LIST__
0804a018 A __bss_start
0804a010 D __data_start
08048580 t __do_global_ctors_aux
08048450 t __do_global_dtors_aux
6: strip取出程序中符號
7: strings查看可執行文件中的文本信息
1.編譯缺少lib,使用yum安裝
2.沒有設置prefix,不知道安裝到那里
3.安裝完成直接執行git無反應,需要建立軟連接
make prefix=/usr/local all doc
reboot以后就可以看到:
1.需要root權限,所以要用root登錄 ,或su root
2.yum install "@Chinese Support"
3.exit
4.回到桌面,system->preferences->input method
5.如果沒有,先注銷一下。
6.按照提示添加輸入法。
7.最后 再次注銷,登錄即可。
設置:
在linux CentOS中安裝完中文輸入法之后,還不能使用,必須進行相應的設置,就如同在windows中設置中文輸入法一樣,必須把剛剛安裝的輸入法添加愛到輸入法列表中。
1、點擊:系統---首選項---輸入法
2、勾選啟用輸入法特性
3、點擊首選輸入法
在常規選項卡中可以設置輸入法切換的快捷鍵
4、點擊輸入法選項卡,選擇漢語,在列表中選擇拼音(當然,你會其他的輸入法也可以選擇其他的)
點擊添加,將選中的輸入法添加到輸入法列表
5、點擊高級選項卡,勾選鍵盤布局、全局輸入法設置。關閉。
1.需要root權限,所以要用root登錄 ,或su root
2.yum install "@Chinese Support"
3.exit
4.回到桌面,system->preferences->input method
5.如果沒有,先注銷一下。
6.按照提示添加輸入法。
7.最后 再次注銷,登錄即可。
設置:
在linux CentOS中安裝完中文輸入法之后,還不能使用,必須進行相應的設置,就如同在windows中設置中文輸入法一樣,必須把剛剛安裝的輸入法添加愛到輸入法列表中。
1、點擊:系統---首選項---輸入法
2、勾選啟用輸入法特性
3、點擊首選輸入法
在常規選項卡中可以設置輸入法切換的快捷鍵
4、點擊輸入法選項卡,選擇漢語,在列表中選擇拼音(當然,你會其他的輸入法也可以選擇其他的)
點擊添加,將選中的輸入法添加到輸入法列表
5、點擊高級選項卡,勾選鍵盤布局、全局輸入法設置。關閉。
最優的設置應該是net方式,最簡單的方式應該是是bridge方式。
net方式的優勢在于不收host機器網絡環境變化印象,這次是vm10下做的配置,修改以后發現都ping不通vm網關,但是機器相互可以ping
vmware三種網絡連接上網設置:
虛擬機更改ip地址的命令:
sudo /root/bin/newIP <new-AES-IP> <networkMASK> <Gateway> <DNServer>
1.bridge :
默認使用vmnet0
將虛擬機的ip設置與主機同網段未使用ip,其余與主機相同:
例如主機ip是10.70.54.31,設置虛擬機ip為10.70.54.22。netmask,broadcast,gateway,dns都與主機相同即可實現虛擬機<--->主機 虛擬機<---->互聯網 通信。
2.nat :
默認使用vmnet8
將虛擬機設置成使用dhcp方式上網,windows下選擇"自動獲取ip",linux下開啟dhcp服務即可
也可以手動設置:
ip設置與vmnet8同網段,gateway設置成vmnet8的gateway(/etc/vmware/vmnet8/nat/nat.conf)中可以查到vmnet8的gateway,通常是xxx.xxx.xxx.2。
netmask,broadcast設置與vmnet8相同,dns設置與主機相同。
例如 vmnet8 ip:172.16.249.1 gw :172.16.249.2
虛擬機設置: ip :172.16.249.100 gw: 172.16.249.2
3.host-only :
默認使用vmnet1
將虛擬機ip設置與vmnet1同網段,gateway設置成vmnet1的ip,其余設置與vmnet1相同,dns設置與主機相同
例如 vmnet1 ip :172.16.245.1
虛擬機設置: ip :172.16.245.100 gateway :172.16.245.1
這樣就實現了虛擬機<--->主機 通信,但是 虛擬機<--->互聯網 仍無法通信
虛擬機與互聯網通信:
1.開啟主機路由功能
2.設定iptables,使主機成為一臺nat server
1. echo 1 >/proc/sys/net/ipv4/ip_forward 這樣就主機就具有了路由功能
2. iptables -t nat -A POSTROUTING -o eth0 -s 172.16.245.0/24 -j MASQUERADE
這條規則意思是將來自172.16.245.0/24封包的來源ip偽裝成eth0的ip,實現虛擬機與互聯網通信
如果網絡接口是ppp+或pppoe則需要修改成-o pppoe
當然-s 172.16.245.0/24 也要根據實際情況修改
2.了解怎么讓bash登錄以后自動執行一段命令
在/etc/profile文件里添加
source $HOME/.bashrc
總之就是為了在登錄cygwin時,加載~/.bashrc
2. 在需要ssh登錄的主機上,配置好cygwin和sshd.
3.使用mkpasswd -l > /etc/passwd 來建立local password條目,
3.是用mkpasswd -d -u 123456 >> /etc/passwd 在passwd里追加一個域用戶. -d 表示domain
4.mkgroup -d >> /etc/group,把用戶所在的組gid也添加進去.
5.運用mkpasswd來添加用戶,本地的和域的都可以,用mkgroup添加用戶相應的組信息.
6.域用戶如果在本地組里,這樣混合一起用是可以的啦.
切換到unicode編譯以后發現款字符的中文全部無法輸出,查詢以后是Locale引起的,首先用SetLocal設置程序local發現無效,最后定位到log4cplus配置文件:
log4cplus.appender.complete.Locale=chs
這樣設置之后發現尼瑪還是不行,繼續分析,發現是filename的中文部分被截斷了。
然后對log4cplus的代碼動手,__FILENAME__改成LOG4CPLUS_TEXT(__FILENAME__),修改一對錯誤之后發現勉強可以用了,但還是有缺陷,早日自己動手寫才是王道,,,