青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

吾嘗終日而思矣 不如須臾之所學(xué)也

御物而行 御風(fēng)而飛
隨筆 - 10, 文章 - 1, 評(píng)論 - 9, 引用 - 0
數(shù)據(jù)加載中……

置頂隨筆

[置頂]Cmake的介紹和使用 Cmake實(shí)踐

Cmake優(yōu)點(diǎn):

1.       開(kāi)發(fā)源代碼,實(shí)用類(lèi)BSD許可發(fā)布。

2.       跨平臺(tái),并可以生成native編譯配置文件,在linux/unix平臺(tái),生成makefile,在mac平臺(tái)可以生成xcode,在windows平臺(tái)可以生成msvc工程的配置文件。

3.       能夠管理大型項(xiàng)目

4.       簡(jiǎn)化編譯構(gòu)建過(guò)程和編譯過(guò)程,只需要cmake+make就可以

5.       高效率

6.       可擴(kuò)展,可以為cmake編寫(xiě)特定功能的模塊,擴(kuò)充cmake功能

如何安裝cmake

1.       Cmake的安裝可以使用autotools進(jìn)行安裝,點(diǎn)擊cmake-2.8.6.tar.gz 鏈接,可以對(duì)軟件進(jìn)行下載。

2.       ./configure

3.       make

4.       sudo make install

 

Cmake的原理

 

Helloworld cmake

//main.cpp

#include<cstdio>

 

int main()

{

    printf("hello world from main\n");

    return 0;

}

 

創(chuàng)建CMakeLists.txt(注意大小寫(xiě)一個(gè)字母都不能錯(cuò))

向該文件中加入以下幾行(稍后會(huì)做解釋?zhuān)?/span>

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

運(yùn)行以下命令:

cmake . (別忘記加上這個(gè)點(diǎn),表示當(dāng)前目錄)


注意執(zhí)行完這句話之后會(huì)生成幾個(gè)文件如下:


CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile

然后執(zhí)行make 就可以生成可執(zhí)行文件hello


這是當(dāng)前目錄下就會(huì)生成可執(zhí)行文件如下圖:


對(duì)例子的解釋?zhuān)?/span>

CMakeLists.txt的內(nèi)容如下:

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

 

Project的指令的語(yǔ)法是:

PROJECT(projectname [CXX] [C] [JAVA])

這個(gè)執(zhí)行是用來(lái)定義工程的名稱(chēng)的和定義工程支持的語(yǔ)言。這個(gè)指令也隱式的定義了兩個(gè)cmake變量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,這里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,兩個(gè)變量指的都是當(dāng)前工程的路徑。

SET指令的語(yǔ)法:

SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])

Set指令是用來(lái)顯式的定義變量的,我們之前用到的是SET(SRC_LIST main.cpp)如果有多個(gè)源文件,也可以定義成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。

 

MESSAGE指令的語(yǔ)法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

這個(gè)指令用于向終端輸出用戶信息,包含三種類(lèi)型:

SEND_ERROR,產(chǎn)生錯(cuò)誤,生成過(guò)程被跳過(guò)。

SATUS,輸出前綴為-的信息。

FATAL_ERROR,立即終止所有cmake過(guò)程。

我們?cè)谶@里使用的是STATUS信息輸出,顯示了由PROJECT指令頂一頂兩個(gè)飲食變量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

 

ADD_EXECUTABLE(hello ${SRC_LIST})

定義了這個(gè)工程會(huì)生成一個(gè)文件名為hello的可執(zhí)行文件,相關(guān)的源文件是SRC_LIST中定義的源文件列表,本例中你可以直接寫(xiě)成ADD_EXECUTABLE(hello main.c)。

 

將本例改寫(xiě)成一個(gè)最簡(jiǎn)化的CMakeLists.txt:

PROJECT(HELLO)

ADD_EXECUTABLE(hello main.c)

 

下面我們介紹一個(gè)比較實(shí)用的例子,即包含生成靜態(tài)庫(kù)又包含引入外部頭文件和鏈接庫(kù)的cmake demo。

先按照工程規(guī)范建立工程目錄,并編寫(xiě)代碼,以下面的工程目錄為例進(jìn)行解釋這個(gè)例子,工程的目錄結(jié)構(gòu)為:

 

編譯工程要實(shí)現(xiàn)的目標(biāo):

1. 添加子目錄doc,用以放置這個(gè)工程的文檔hello.txt

2. 生成hello的靜態(tài)庫(kù),并在main可執(zhí)行程序鏈接hello靜態(tài)庫(kù)

3. 在這個(gè)工程中添加COPYRIGHT,README

4. 在工程目錄中添加一個(gè)run.sh的腳本,用以調(diào)用生成的二進(jìn)制可執(zhí)行文件

5. 將生成的二進(jìn)制文件生成到bin子目錄中

6. 編寫(xiě)安裝程序

 

1. 編寫(xiě)CMakeLists.txt

由于一個(gè)工程目錄中包含多個(gè)項(xiàng)目,其中在此項(xiàng)目中包含util項(xiàng)目和main項(xiàng)目,其中util項(xiàng)目是用以生成main程序需要的靜態(tài)庫(kù),main是用以生成可執(zhí)行文件。

在工程項(xiàng)目中的父目錄向有一個(gè)CMakeLists.txt是用以聲明定義工程需要的Cmake設(shè)置還定義了子目錄src,用以遞歸的調(diào)用src中的MakeLists.txt。其中工程目錄的CMakeLists.txt內(nèi)容定義如下:

PROJECT(HELLO)

ADD_SUBDIRECTORY(src)

在src里面的CMakeLists.txt是用以定義src目錄包含的兩個(gè)工程的依賴關(guān)系分別進(jìn)行編譯。

util目錄里面的CMakeLists.txt是用以定義生成util靜態(tài)庫(kù)的規(guī)則,其中內(nèi)容如下:

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)

SET(CMAKE_C_COMPILER g++)

SET(SRC_LIST hello.c)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

ADD_LIBRARY(util STATIC ${SRC_LIST})

其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定義了庫(kù)生成的路徑,LIBRARY_OUTPUT_PATH是一個(gè)內(nèi)部變量,存放庫(kù)生成路徑。

SET(SRC_LIST hello.c)是用來(lái)定義庫(kù)文件需要的源文件。

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用來(lái)定義非標(biāo)準(zhǔn)庫(kù)頭文件要搜索的路徑。其中INCLUDE_DIRECTORIES命令的格式為:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

ADD_LIBRARY(util STATIC ${SRC_LIST})是用來(lái)定義生成的庫(kù)的名字,以及生成庫(kù)的類(lèi)型和生成庫(kù)需要的源文件,其中ADD_LIBRARY命令格式為:

     ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

          [EXCLUDE_FROM_ALL]

                source1 source2 ... sourceN)

SET(CMAKE_C_COMPILER g++)是用來(lái)定義c的編譯器為g++,防止出現(xiàn)C和C++代碼在不指定C編譯器的情況下默認(rèn)使用gcc,導(dǎo)致系統(tǒng)編譯混亂。

在main目錄中的CMakeLists.txt是用來(lái)定義可執(zhí)行程序編譯和鏈接時(shí)所需要的一些命令或環(huán)境。內(nèi)容如下:

SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)

SET(SRC_LIST main.cpp)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)

 

ADD_EXECUTABLE(hello ${SRC_LIST})

TARGET_LINK_LIBRARIES(hello util)

INCLUDE_DIRECTORIES命令是定義工程的include文件夾,其中存放使用到的庫(kù)的頭文件,LINK_DIRECTORIES是定義工程的庫(kù)文件,其中存放著庫(kù)文件,ADD_EXECUTABLE是定義生成的可執(zhí)行文件,TARGET_LINK_LIBRARIES用以定義鏈接時(shí)需要的庫(kù)文件。

2.在工程目錄下創(chuàng)建build目錄,并采用out-of-source方式編譯項(xiàng)目。執(zhí)行命令make ..,執(zhí)行結(jié)果如下:


執(zhí)行make,這時(shí)在build目錄下生成了中間編譯文件:


執(zhí)行make命令,結(jié)果如下:


可以看到工程創(chuàng)建和編譯成功了。

2. 安裝

在工程目錄下添加COPYRIGHT、README、和run.sh,重新編輯工程目錄下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)

INSTALL(PROGRAMS run.sh DESTINATION bin)

INSTALL(PROGRAMS bin/hello DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

這些命令表示在執(zhí)行make install命令時(shí),安裝程序會(huì)拷貝相應(yīng)的文件、目錄或程序到指定的前綴開(kāi)始的目錄中,cmake執(zhí)行命令如下:

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..這時(shí)將工程目錄安裝到~/data/cmake_demo目錄下。執(zhí)行結(jié)果如下:


其中cmake編譯c、c++工程完畢。

posted @ 2011-11-17 20:18 Roger 閱讀(72105) | 評(píng)論 (2)編輯 收藏

[置頂]Makefile 解析

一個(gè)工程中的源文件可能很多的情況下,按其類(lèi)型、功能、模塊分別放到若干個(gè)目錄中,makefile定義了一系列的規(guī)則,用以指定那些需要先編譯,那些需要后編譯,那些需要重新編譯,和一些更復(fù)雜的操作。,makefile的好處就是自動(dòng)化編譯,一點(diǎn)寫(xiě)好,只需要make命令,整個(gè)工程就會(huì)自動(dòng)編譯,提高了項(xiàng)目的管理能力和軟件的開(kāi)發(fā)效率。

Makefile 文件解讀

 

edit : main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

cc -o edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

 

main.o : main.c defs.h 

cc -c main.c 

kbd.o : kbd.c defs.h command.h 

cc -c kbd.c 

command.o : command.c defs.h command.h 

cc -c command.c 

display.o : display.c defs.h buffer.h 

cc -c display.c 

insert.o : insert.c defs.h buffer.h 

cc -c insert.c 

search.o : search.c defs.h buffer.h 

cc -c search.c 

files.o : files.c defs.h buffer.h command.h 

cc -c files.c 

utils.o : utils.c defs.h 

cc -c utils.c 

clean : 

rm edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

 

反斜杠(\)是換行的意思。上述makefile文件可以命名為makefileMakefile,如果在目錄中輸入make,就可以生成edit可執(zhí)行文件。如果想要?jiǎng)h除可執(zhí)行文件或者是中間目標(biāo)文件直接make clean就行了。

依賴關(guān)系:

有上述例子可以看出,目標(biāo)文件包含兩種:執(zhí)行文件(edit)和中間目標(biāo)文件(*.obj),依賴文件(prerequisites)就是冒號(hào)后面的那些.c.h文件。每一個(gè).o 文件都有一組依賴文件,這些.o的文件又是執(zhí)行文件edit的依賴文件。其實(shí)依賴關(guān)系就是說(shuō)明了目標(biāo)文件是有那些文件申城的,換言之就是目標(biāo)文件是哪些文件更新的。

定義好依賴關(guān)系后,后面的一行就定義了如何生成目標(biāo)文件的操作系統(tǒng)命令,一定要以tab鍵開(kāi)頭。記住make并不管命令式怎么工作的,它只關(guān)心定義的命令。Make會(huì)比較目標(biāo)文件和依賴文件的修改日期,如果依賴文件的日期要比目標(biāo)文件的日期更新,或者是目標(biāo)文件不存在的話,make就會(huì)執(zhí)行后續(xù)定義的命令。

 

Make是如何工作的

1.       查找Makefilemakefile文件

2.       查找第一個(gè)目標(biāo)文件,并將這個(gè)文件作為最終的目標(biāo)文件

3.       查找目標(biāo)文件是否存在,或者是當(dāng)前目標(biāo)文件依賴的.o 文件的文件修改時(shí)間要比當(dāng)前目標(biāo)文件新,則執(zhí)行后面定義的命令來(lái)生成edit這個(gè)文件

4.       如果edit依賴的.o文件也存在,那么make會(huì)在當(dāng)前文件中查找目標(biāo)文件為.o文件的依賴性,如果找到則根據(jù)哪一個(gè)規(guī)則生成.o文件。

5.       根據(jù)c文件和.h文件,make生成.o文件,然后生成最終目標(biāo)文件。

 

Make會(huì)一層已成的查找文件的依賴關(guān)系,知道最終編譯出第一個(gè)目標(biāo)文件。在查找過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如被依賴的文件找不到,那么make就會(huì)直接退出,并報(bào)錯(cuò),但是對(duì)于所定義的命令的錯(cuò)誤,或者是編譯不成功,make會(huì)置之不理。但是當(dāng)查找到一個(gè)文件的依賴關(guān)系的時(shí)候,并且執(zhí)行依賴關(guān)系之后命令,冒號(hào)后面的依賴文件如果還是不存在,那么make就會(huì)退出。

由上可知,想clean這種沒(méi)有被第一個(gè)目標(biāo)文件直接或間接關(guān)聯(lián),那么他后面定義的命令將不會(huì)自動(dòng)執(zhí)行。如果想顯式執(zhí)行要求make執(zhí)行clean之后的命令,“輸入make clean”就行了,用以清除所有的目標(biāo)文件,便于重新編譯。

1.       另外makefile中也可以添加一些宏定義(變量)

2.       gnu make可以實(shí)現(xiàn)自動(dòng)推倒

posted @ 2011-11-17 20:04 Roger 閱讀(7967) | 評(píng)論 (0)編輯 收藏

[置頂]C++編譯器 GCC G++ 使用

     摘要: 什么是gcc、什么是g++?
gcc和g++都是GNU(組織)的一個(gè)編譯器。
但兩者有一些區(qū)別:后綴為.c的文件gcc把它當(dāng)做c程序,g++當(dāng)做c++程序。后綴為c++的兩者都當(dāng)做c++程序。對(duì)于cpp程序,無(wú)論gcc或者是g++編譯階段都是相同的,都是用的gcc進(jìn)行編譯,但是在鏈接階段gcc不能自動(dòng)和c++程序使用的庫(kù)連接,如果使用的話,形如下: gcc helloworld.cpp -lstdc++ -o helloworld
所以我們通常用g++來(lái)進(jìn)行連接(g++會(huì)自動(dòng)連接c++常用庫(kù)),所以為了使用方便對(duì)于cpp程序干脆編譯鏈接統(tǒng)統(tǒng)都使用g++,這樣就給人一種錯(cuò)覺(jué),好像cpp只能用g++編譯。

Gcc編譯處理過(guò)程是什么呢?
下面以helloworld程序?yàn)槔ミM(jìn)行解釋過(guò)程:
其中hello.c的內(nèi)容如下:
#include

int main()
{
printf("hello world\n");
}
第一步:預(yù)處理
預(yù)  閱讀全文

posted @ 2011-11-13 15:01 Roger 閱讀(11458) | 評(píng)論 (1)編輯 收藏

[置頂]詳盡的Mysql安裝過(guò)程 講解

安裝步驟:

inux平臺(tái)mysql source安裝的安裝及配置步驟

1、 下載MySQLsourcecode

進(jìn)入mysql download頁(yè)面http://dev.mysql.com/downloads/

  點(diǎn)擊進(jìn)入http://dev.mysql.com/downloads/mysql/ 到如下頁(yè)面:

    

   選擇sourcecode下拉列表進(jìn)入到如下頁(yè)面:

    
  點(diǎn)擊 Generic Linux (Architecture Independent), Compressed TAR Archive,進(jìn)入
    
選擇 » No thanks, just take me to the downloads!

進(jìn)行下載

2、 安裝MySQL

解壓mysql5 的安裝包:

[root@niutian365 local]# tar zxvf mysql-5.5.16.tar.gz

進(jìn)入解壓后的安裝包

:[root@niutian365 local]# cd mysql-5.5.16

3、 選擇root用戶進(jìn)入,建立mysql用戶組和用戶名:

建立mysql用戶組:groupadd mysql

建立mysql用戶并將mysql用戶加到mysql用戶組中: useradd -g mysql mysql

4、 創(chuàng)建/usr/mysql/mysql/usr/mysql/data/usr/mysql/log目錄

mkdir /usr/mysql/mysql

mkdir /usr/mysql/data

cmake 編譯sourcecode

cmake -DCMAKE_INSTALL_PREFIX=/mysql/mysql

-DMYSQL_DATADIR=/mysql/mysql/data

-DDEFAULT_CHARSET=utf8

-DDEFAULT_COLLATION=utf8_general_ci

-DWITH_INNOBASE_STORAGE_ENGINE=1

-DWITH_ARCHIVE_STORAGE_ENGINE=1

-DWITH_BLACKHOLE_STORAGE_ENGINE=1

-DWITH_FEDERATED_STORAGE_ENGINE=1

-DWITH_PARTITION_STORAGE_ENGINE=1

-DENABLED_LOCAL_INFILE=1

-DMYSQL_UNIX_ADDR=/mysql/mysql/data/mysql.sock

5、 復(fù)制配置文件到/etc

[root@niutian365 local]#vi /etc/my.cnf

修改

[mysqld]

basedir=/home/mysql/mysql

datadir=/home/mysql/data

socket=/var/lib/mysql/mysql.sock

[mysqld_safe]

log-error=/home/mysql/log/mysqld.log

pid-file=/home/mysql/log/mysqld.pid

6、 修改文件的文件主:

chown –R mysql:mysql /home/mysql/log/

chown –R mysql:mysql /var/lib/mysql

 

運(yùn)行[root@niutian365 local]#./usr/local/mysql/bin/mysql_install_db

在這一步中可能會(huì)發(fā)生錯(cuò)誤,查看錯(cuò)誤原因,如果是由于權(quán)限的問(wèn)題則需要將父目錄擁有者改成mysql:mysql,使用chown –R mysql:mysql XXX

7、 運(yùn)行mysql

進(jìn)入mysqlbin目錄,運(yùn)行sh mysqld_safe

如果不能正常運(yùn)行,可以查看log目錄下的mysqld.log,查看錯(cuò)誤信息,然后做出相應(yīng)的修改。

8、 mysql注冊(cè)為服務(wù)

mysql源代碼目錄的support-files/mysql.server拷貝至/etc/init.d/,重命名為mysqld

安裝chkconfig: apt-get install chkconfig 

運(yùn)行 chkconfig -add mysql注冊(cè)服務(wù)

運(yùn)行 mysql start開(kāi)啟服務(wù)

運(yùn)行 mysql stop關(guān)閉服務(wù)

 

修改遠(yuǎn)程登錄mysql權(quán)限,現(xiàn)在提供兩種支持遠(yuǎn)程登錄的方法:

1.       改表法。其中在user表中的host那一列保存的是user允許的用戶登錄的位置信息,通過(guò)修改這一列的數(shù)據(jù)來(lái)修改mysql的遠(yuǎn)程登錄,使用如下命令進(jìn)入mysqlmysql –u root –p 輸入密碼(默認(rèn)為空)第一次進(jìn)入到數(shù)據(jù)庫(kù)系統(tǒng)。

選擇數(shù)據(jù)庫(kù):mysql> use mysql;

如下圖所示執(zhí)行sql命令:

說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\EOQH1V)J62%D[KFZM8N)MB5.jpg

由上圖可以看到,mysql只允許127.0.0.1localhost,以及localhost.localdomain的機(jī)器以root身份登錄到mysql數(shù)據(jù)庫(kù)中,下面我們做如下更改:

說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\4AY[GQ~VX4TDD$S4@)[E[ZS.jpg

上面的error是有host是唯一屬性導(dǎo)致的錯(cuò)誤,可以不用理會(huì),現(xiàn)在我們已經(jīng)改好了mysql遠(yuǎn)程登錄的配置,一定要主要通過(guò)如下命令是上述做的改動(dòng)生效。

mysql> FLUSH PRIVILEGES;

好了現(xiàn)在可以在其他機(jī)器上進(jìn)行遠(yuǎn)程登錄mysql了。

2.       授權(quán)法。

使用如下命令:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '111111' WITH GRANT OPTION;root用戶在任意機(jī)器上以111111密碼訪問(wèn),上面的執(zhí)行結(jié)果如下:

實(shí)際上,在user表中添加了一行,如上面標(biāo)注部分。如果你想允許用戶myuserip192.168.1.3的主機(jī)連接到mysql服務(wù)器,并使用mypassword作為密碼,執(zhí)行如下語(yǔ)句:

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

Mysql修改密碼:

UPDATE user SET password=password('111111') where user='root'; 

mysql> FLUSH privileges;

如下圖:

         說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\]T~OX)`1~3OC8XFW04KP9DI.jpg

請(qǐng)注意,此密碼是經(jīng)過(guò)hash后的密碼,不能用原密碼如mysql> update user set password = 111111 where user = 'root' ;這樣是不正確的。

Mysql添加用戶:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sphinx'@'%' IDENTIFIED BY '111111' WITH GRANT OPTION;                          

Query OK, 0 rows affected (0.00 sec)

 

mysql> FLUSH PRIVILEGES;                                                                   

Query OK, 0 rows affected (0.00 sec)

以上命令是創(chuàng)建sphinx用戶遠(yuǎn)程登錄mysql,密碼是111111

 

posted @ 2011-10-09 13:30 Roger 閱讀(2443) | 評(píng)論 (3)編輯 收藏

2012年11月15日

WeiboHotGather Download

this is the link address

posted @ 2012-11-15 18:03 Roger 閱讀(566) | 評(píng)論 (0)編輯 收藏

2011年11月17日

Cmake的介紹和使用 Cmake實(shí)踐

Cmake優(yōu)點(diǎn):

1.       開(kāi)發(fā)源代碼,實(shí)用類(lèi)BSD許可發(fā)布。

2.       跨平臺(tái),并可以生成native編譯配置文件,在linux/unix平臺(tái),生成makefile,在mac平臺(tái)可以生成xcode,在windows平臺(tái)可以生成msvc工程的配置文件。

3.       能夠管理大型項(xiàng)目

4.       簡(jiǎn)化編譯構(gòu)建過(guò)程和編譯過(guò)程,只需要cmake+make就可以

5.       高效率

6.       可擴(kuò)展,可以為cmake編寫(xiě)特定功能的模塊,擴(kuò)充cmake功能

如何安裝cmake

1.       Cmake的安裝可以使用autotools進(jìn)行安裝,點(diǎn)擊cmake-2.8.6.tar.gz 鏈接,可以對(duì)軟件進(jìn)行下載。

2.       ./configure

3.       make

4.       sudo make install

 

Cmake的原理

 

Helloworld cmake

//main.cpp

#include<cstdio>

 

int main()

{

    printf("hello world from main\n");

    return 0;

}

 

創(chuàng)建CMakeLists.txt(注意大小寫(xiě)一個(gè)字母都不能錯(cuò))

向該文件中加入以下幾行(稍后會(huì)做解釋?zhuān)?/span>

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

運(yùn)行以下命令:

cmake . (別忘記加上這個(gè)點(diǎn),表示當(dāng)前目錄)


注意執(zhí)行完這句話之后會(huì)生成幾個(gè)文件如下:


CMakeFiles, CMakeCache.txt, cmake_install.cmake等文件,并且生成了Makefile

然后執(zhí)行make 就可以生成可執(zhí)行文件hello


這是當(dāng)前目錄下就會(huì)生成可執(zhí)行文件如下圖:


對(duì)例子的解釋?zhuān)?/span>

CMakeLists.txt的內(nèi)容如下:

PROJECT (HELLO)

SET(SRC_LIST main.cpp)

MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})

MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})

ADD_EXECUTABLE(hello ${SRC_LIST})

 

Project的指令的語(yǔ)法是:

PROJECT(projectname [CXX] [C] [JAVA])

這個(gè)執(zhí)行是用來(lái)定義工程的名稱(chēng)的和定義工程支持的語(yǔ)言。這個(gè)指令也隱式的定義了兩個(gè)cmake變量:<projectname>_BINARY_DIR以及<projectname>_BINARY_DIR,這里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,兩個(gè)變量指的都是當(dāng)前工程的路徑。

SET指令的語(yǔ)法:

SET(VAR[VALUE] [CACHE TYPE DOCSTRING [FORCE]])

Set指令是用來(lái)顯式的定義變量的,我們之前用到的是SET(SRC_LIST main.cpp)如果有多個(gè)源文件,也可以定義成SET(SRC_LIST main.cpp t1.cpp t2.cpp)。

 

MESSAGE指令的語(yǔ)法是:

MESSAGE([SEND_ERROR | STATUS | FATAL_ERROR] "message to display" ...)

這個(gè)指令用于向終端輸出用戶信息,包含三種類(lèi)型:

SEND_ERROR,產(chǎn)生錯(cuò)誤,生成過(guò)程被跳過(guò)。

SATUS,輸出前綴為-的信息。

FATAL_ERROR,立即終止所有cmake過(guò)程。

我們?cè)谶@里使用的是STATUS信息輸出,顯示了由PROJECT指令頂一頂兩個(gè)飲食變量HELLO_BINARY_DIR和HELLO_SOURCE_DIR。

 

ADD_EXECUTABLE(hello ${SRC_LIST})

定義了這個(gè)工程會(huì)生成一個(gè)文件名為hello的可執(zhí)行文件,相關(guān)的源文件是SRC_LIST中定義的源文件列表,本例中你可以直接寫(xiě)成ADD_EXECUTABLE(hello main.c)。

 

將本例改寫(xiě)成一個(gè)最簡(jiǎn)化的CMakeLists.txt:

PROJECT(HELLO)

ADD_EXECUTABLE(hello main.c)

 

下面我們介紹一個(gè)比較實(shí)用的例子,即包含生成靜態(tài)庫(kù)又包含引入外部頭文件和鏈接庫(kù)的cmake demo。

先按照工程規(guī)范建立工程目錄,并編寫(xiě)代碼,以下面的工程目錄為例進(jìn)行解釋這個(gè)例子,工程的目錄結(jié)構(gòu)為:

 

編譯工程要實(shí)現(xiàn)的目標(biāo):

1. 添加子目錄doc,用以放置這個(gè)工程的文檔hello.txt

2. 生成hello的靜態(tài)庫(kù),并在main可執(zhí)行程序鏈接hello靜態(tài)庫(kù)

3. 在這個(gè)工程中添加COPYRIGHT,README

4. 在工程目錄中添加一個(gè)run.sh的腳本,用以調(diào)用生成的二進(jìn)制可執(zhí)行文件

5. 將生成的二進(jìn)制文件生成到bin子目錄中

6. 編寫(xiě)安裝程序

 

1. 編寫(xiě)CMakeLists.txt

由于一個(gè)工程目錄中包含多個(gè)項(xiàng)目,其中在此項(xiàng)目中包含util項(xiàng)目和main項(xiàng)目,其中util項(xiàng)目是用以生成main程序需要的靜態(tài)庫(kù),main是用以生成可執(zhí)行文件。

在工程項(xiàng)目中的父目錄向有一個(gè)CMakeLists.txt是用以聲明定義工程需要的Cmake設(shè)置還定義了子目錄src,用以遞歸的調(diào)用src中的MakeLists.txt。其中工程目錄的CMakeLists.txt內(nèi)容定義如下:

PROJECT(HELLO)

ADD_SUBDIRECTORY(src)

在src里面的CMakeLists.txt是用以定義src目錄包含的兩個(gè)工程的依賴關(guān)系分別進(jìn)行編譯。

util目錄里面的CMakeLists.txt是用以定義生成util靜態(tài)庫(kù)的規(guī)則,其中內(nèi)容如下:

SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)

SET(CMAKE_C_COMPILER g++)

SET(SRC_LIST hello.c)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

ADD_LIBRARY(util STATIC ${SRC_LIST})

其中SET(LIBRARY_OUTPUT_PATH ${HELLO_SOURCE_DIR}/lib)定義了庫(kù)生成的路徑,LIBRARY_OUTPUT_PATH是一個(gè)內(nèi)部變量,存放庫(kù)生成路徑。

SET(SRC_LIST hello.c)是用來(lái)定義庫(kù)文件需要的源文件。

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)是用來(lái)定義非標(biāo)準(zhǔn)庫(kù)頭文件要搜索的路徑。其中INCLUDE_DIRECTORIES命令的格式為:

INCLUDE_DIRECTORIES([AFTER|BEFORE] [SYSTEM] dir1 dir2 ...)

ADD_LIBRARY(util STATIC ${SRC_LIST})是用來(lái)定義生成的庫(kù)的名字,以及生成庫(kù)的類(lèi)型和生成庫(kù)需要的源文件,其中ADD_LIBRARY命令格式為:

     ADD_LIBRARY(libname    [SHARED|STATIC|MODULE]

          [EXCLUDE_FROM_ALL]

                source1 source2 ... sourceN)

SET(CMAKE_C_COMPILER g++)是用來(lái)定義c的編譯器為g++,防止出現(xiàn)C和C++代碼在不指定C編譯器的情況下默認(rèn)使用gcc,導(dǎo)致系統(tǒng)編譯混亂。

在main目錄中的CMakeLists.txt是用來(lái)定義可執(zhí)行程序編譯和鏈接時(shí)所需要的一些命令或環(huán)境。內(nèi)容如下:

SET(EXECUTABLE_OUTPUT_PATH ${HELLO_SOURCE_DIR}/bin)

SET(SRC_LIST main.cpp)

 

INCLUDE_DIRECTORIES(${HELLO_SOURCE_DIR}/include)

LINK_DIRECTORIES(${HELLO_SOURCE_DIR}/lib)

 

ADD_EXECUTABLE(hello ${SRC_LIST})

TARGET_LINK_LIBRARIES(hello util)

INCLUDE_DIRECTORIES命令是定義工程的include文件夾,其中存放使用到的庫(kù)的頭文件,LINK_DIRECTORIES是定義工程的庫(kù)文件,其中存放著庫(kù)文件,ADD_EXECUTABLE是定義生成的可執(zhí)行文件,TARGET_LINK_LIBRARIES用以定義鏈接時(shí)需要的庫(kù)文件。

2.在工程目錄下創(chuàng)建build目錄,并采用out-of-source方式編譯項(xiàng)目。執(zhí)行命令make ..,執(zhí)行結(jié)果如下:


執(zhí)行make,這時(shí)在build目錄下生成了中間編譯文件:


執(zhí)行make命令,結(jié)果如下:


可以看到工程創(chuàng)建和編譯成功了。

2. 安裝

在工程目錄下添加COPYRIGHT、README、和run.sh,重新編輯工程目錄下的CMakeLists.txt。在CMakeLists.txt中添加如下命令:

INSTALL(FILES COPYRIGHT README DESTINATION share/doc/cmake_demo)

INSTALL(PROGRAMS run.sh DESTINATION bin)

INSTALL(PROGRAMS bin/hello DESTINATION bin)

INSTALL(DIRECTORY doc/ DESTINATION share/doc/cmake_demo)

這些命令表示在執(zhí)行make install命令時(shí),安裝程序會(huì)拷貝相應(yīng)的文件、目錄或程序到指定的前綴開(kāi)始的目錄中,cmake執(zhí)行命令如下:

cmake -DCMAKE_INSTALL_PREFIX=~/data/cmake_demo ..這時(shí)將工程目錄安裝到~/data/cmake_demo目錄下。執(zhí)行結(jié)果如下:


其中cmake編譯c、c++工程完畢。

posted @ 2011-11-17 20:18 Roger 閱讀(72105) | 評(píng)論 (2)編輯 收藏

Makefile 解析

一個(gè)工程中的源文件可能很多的情況下,按其類(lèi)型、功能、模塊分別放到若干個(gè)目錄中,makefile定義了一系列的規(guī)則,用以指定那些需要先編譯,那些需要后編譯,那些需要重新編譯,和一些更復(fù)雜的操作。,makefile的好處就是自動(dòng)化編譯,一點(diǎn)寫(xiě)好,只需要make命令,整個(gè)工程就會(huì)自動(dòng)編譯,提高了項(xiàng)目的管理能力和軟件的開(kāi)發(fā)效率。

Makefile 文件解讀

 

edit : main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

cc -o edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

 

main.o : main.c defs.h 

cc -c main.c 

kbd.o : kbd.c defs.h command.h 

cc -c kbd.c 

command.o : command.c defs.h command.h 

cc -c command.c 

display.o : display.c defs.h buffer.h 

cc -c display.c 

insert.o : insert.c defs.h buffer.h 

cc -c insert.c 

search.o : search.c defs.h buffer.h 

cc -c search.c 

files.o : files.c defs.h buffer.h command.h 

cc -c files.c 

utils.o : utils.c defs.h 

cc -c utils.c 

clean : 

rm edit main.o kbd.o command.o display.o \ 

insert.o search.o files.o utils.o 

 

反斜杠(\)是換行的意思。上述makefile文件可以命名為makefileMakefile,如果在目錄中輸入make,就可以生成edit可執(zhí)行文件。如果想要?jiǎng)h除可執(zhí)行文件或者是中間目標(biāo)文件直接make clean就行了。

依賴關(guān)系:

有上述例子可以看出,目標(biāo)文件包含兩種:執(zhí)行文件(edit)和中間目標(biāo)文件(*.obj),依賴文件(prerequisites)就是冒號(hào)后面的那些.c.h文件。每一個(gè).o 文件都有一組依賴文件,這些.o的文件又是執(zhí)行文件edit的依賴文件。其實(shí)依賴關(guān)系就是說(shuō)明了目標(biāo)文件是有那些文件申城的,換言之就是目標(biāo)文件是哪些文件更新的。

定義好依賴關(guān)系后,后面的一行就定義了如何生成目標(biāo)文件的操作系統(tǒng)命令,一定要以tab鍵開(kāi)頭。記住make并不管命令式怎么工作的,它只關(guān)心定義的命令。Make會(huì)比較目標(biāo)文件和依賴文件的修改日期,如果依賴文件的日期要比目標(biāo)文件的日期更新,或者是目標(biāo)文件不存在的話,make就會(huì)執(zhí)行后續(xù)定義的命令。

 

Make是如何工作的

1.       查找Makefilemakefile文件

2.       查找第一個(gè)目標(biāo)文件,并將這個(gè)文件作為最終的目標(biāo)文件

3.       查找目標(biāo)文件是否存在,或者是當(dāng)前目標(biāo)文件依賴的.o 文件的文件修改時(shí)間要比當(dāng)前目標(biāo)文件新,則執(zhí)行后面定義的命令來(lái)生成edit這個(gè)文件

4.       如果edit依賴的.o文件也存在,那么make會(huì)在當(dāng)前文件中查找目標(biāo)文件為.o文件的依賴性,如果找到則根據(jù)哪一個(gè)規(guī)則生成.o文件。

5.       根據(jù)c文件和.h文件,make生成.o文件,然后生成最終目標(biāo)文件。

 

Make會(huì)一層已成的查找文件的依賴關(guān)系,知道最終編譯出第一個(gè)目標(biāo)文件。在查找過(guò)程中,如果出現(xiàn)錯(cuò)誤,比如被依賴的文件找不到,那么make就會(huì)直接退出,并報(bào)錯(cuò),但是對(duì)于所定義的命令的錯(cuò)誤,或者是編譯不成功,make會(huì)置之不理。但是當(dāng)查找到一個(gè)文件的依賴關(guān)系的時(shí)候,并且執(zhí)行依賴關(guān)系之后命令,冒號(hào)后面的依賴文件如果還是不存在,那么make就會(huì)退出。

由上可知,想clean這種沒(méi)有被第一個(gè)目標(biāo)文件直接或間接關(guān)聯(lián),那么他后面定義的命令將不會(huì)自動(dòng)執(zhí)行。如果想顯式執(zhí)行要求make執(zhí)行clean之后的命令,“輸入make clean”就行了,用以清除所有的目標(biāo)文件,便于重新編譯。

1.       另外makefile中也可以添加一些宏定義(變量)

2.       gnu make可以實(shí)現(xiàn)自動(dòng)推倒

posted @ 2011-11-17 20:04 Roger 閱讀(7967) | 評(píng)論 (0)編輯 收藏

2011年11月13日

C++編譯器 GCC G++ 使用

     摘要: 什么是gcc、什么是g++?
gcc和g++都是GNU(組織)的一個(gè)編譯器。
但兩者有一些區(qū)別:后綴為.c的文件gcc把它當(dāng)做c程序,g++當(dāng)做c++程序。后綴為c++的兩者都當(dāng)做c++程序。對(duì)于cpp程序,無(wú)論gcc或者是g++編譯階段都是相同的,都是用的gcc進(jìn)行編譯,但是在鏈接階段gcc不能自動(dòng)和c++程序使用的庫(kù)連接,如果使用的話,形如下: gcc helloworld.cpp -lstdc++ -o helloworld
所以我們通常用g++來(lái)進(jìn)行連接(g++會(huì)自動(dòng)連接c++常用庫(kù)),所以為了使用方便對(duì)于cpp程序干脆編譯鏈接統(tǒng)統(tǒng)都使用g++,這樣就給人一種錯(cuò)覺(jué),好像cpp只能用g++編譯。

Gcc編譯處理過(guò)程是什么呢?
下面以helloworld程序?yàn)槔ミM(jìn)行解釋過(guò)程:
其中hello.c的內(nèi)容如下:
#include

int main()
{
printf("hello world\n");
}
第一步:預(yù)處理
預(yù)  閱讀全文

posted @ 2011-11-13 15:01 Roger 閱讀(11458) | 評(píng)論 (1)編輯 收藏

2011年10月9日

詳盡的Mysql安裝過(guò)程 講解

安裝步驟:

inux平臺(tái)mysql source安裝的安裝及配置步驟

1、 下載MySQLsourcecode

進(jìn)入mysql download頁(yè)面http://dev.mysql.com/downloads/

  點(diǎn)擊進(jìn)入http://dev.mysql.com/downloads/mysql/ 到如下頁(yè)面:

    

   選擇sourcecode下拉列表進(jìn)入到如下頁(yè)面:

    
  點(diǎn)擊 Generic Linux (Architecture Independent), Compressed TAR Archive,進(jìn)入
    
選擇 » No thanks, just take me to the downloads!

進(jìn)行下載

2、 安裝MySQL

解壓mysql5 的安裝包:

[root@niutian365 local]# tar zxvf mysql-5.5.16.tar.gz

進(jìn)入解壓后的安裝包

:[root@niutian365 local]# cd mysql-5.5.16

3、 選擇root用戶進(jìn)入,建立mysql用戶組和用戶名:

建立mysql用戶組:groupadd mysql

建立mysql用戶并將mysql用戶加到mysql用戶組中: useradd -g mysql mysql

4、 創(chuàng)建/usr/mysql/mysql/usr/mysql/data/usr/mysql/log目錄

mkdir /usr/mysql/mysql

mkdir /usr/mysql/data

cmake 編譯sourcecode

cmake -DCMAKE_INSTALL_PREFIX=/mysql/mysql

-DMYSQL_DATADIR=/mysql/mysql/data

-DDEFAULT_CHARSET=utf8

-DDEFAULT_COLLATION=utf8_general_ci

-DWITH_INNOBASE_STORAGE_ENGINE=1

-DWITH_ARCHIVE_STORAGE_ENGINE=1

-DWITH_BLACKHOLE_STORAGE_ENGINE=1

-DWITH_FEDERATED_STORAGE_ENGINE=1

-DWITH_PARTITION_STORAGE_ENGINE=1

-DENABLED_LOCAL_INFILE=1

-DMYSQL_UNIX_ADDR=/mysql/mysql/data/mysql.sock

5、 復(fù)制配置文件到/etc

[root@niutian365 local]#vi /etc/my.cnf

修改

[mysqld]

basedir=/home/mysql/mysql

datadir=/home/mysql/data

socket=/var/lib/mysql/mysql.sock

[mysqld_safe]

log-error=/home/mysql/log/mysqld.log

pid-file=/home/mysql/log/mysqld.pid

6、 修改文件的文件主:

chown –R mysql:mysql /home/mysql/log/

chown –R mysql:mysql /var/lib/mysql

 

運(yùn)行[root@niutian365 local]#./usr/local/mysql/bin/mysql_install_db

在這一步中可能會(huì)發(fā)生錯(cuò)誤,查看錯(cuò)誤原因,如果是由于權(quán)限的問(wèn)題則需要將父目錄擁有者改成mysql:mysql,使用chown –R mysql:mysql XXX

7、 運(yùn)行mysql

進(jìn)入mysqlbin目錄,運(yùn)行sh mysqld_safe

如果不能正常運(yùn)行,可以查看log目錄下的mysqld.log,查看錯(cuò)誤信息,然后做出相應(yīng)的修改。

8、 mysql注冊(cè)為服務(wù)

mysql源代碼目錄的support-files/mysql.server拷貝至/etc/init.d/,重命名為mysqld

安裝chkconfig: apt-get install chkconfig 

運(yùn)行 chkconfig -add mysql注冊(cè)服務(wù)

運(yùn)行 mysql start開(kāi)啟服務(wù)

運(yùn)行 mysql stop關(guān)閉服務(wù)

 

修改遠(yuǎn)程登錄mysql權(quán)限,現(xiàn)在提供兩種支持遠(yuǎn)程登錄的方法:

1.       改表法。其中在user表中的host那一列保存的是user允許的用戶登錄的位置信息,通過(guò)修改這一列的數(shù)據(jù)來(lái)修改mysql的遠(yuǎn)程登錄,使用如下命令進(jìn)入mysqlmysql –u root –p 輸入密碼(默認(rèn)為空)第一次進(jìn)入到數(shù)據(jù)庫(kù)系統(tǒng)。

選擇數(shù)據(jù)庫(kù):mysql> use mysql;

如下圖所示執(zhí)行sql命令:

說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\EOQH1V)J62%D[KFZM8N)MB5.jpg

由上圖可以看到,mysql只允許127.0.0.1localhost,以及localhost.localdomain的機(jī)器以root身份登錄到mysql數(shù)據(jù)庫(kù)中,下面我們做如下更改:

說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\4AY[GQ~VX4TDD$S4@)[E[ZS.jpg

上面的error是有host是唯一屬性導(dǎo)致的錯(cuò)誤,可以不用理會(huì),現(xiàn)在我們已經(jīng)改好了mysql遠(yuǎn)程登錄的配置,一定要主要通過(guò)如下命令是上述做的改動(dòng)生效。

mysql> FLUSH PRIVILEGES;

好了現(xiàn)在可以在其他機(jī)器上進(jìn)行遠(yuǎn)程登錄mysql了。

2.       授權(quán)法。

使用如下命令:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '111111' WITH GRANT OPTION;root用戶在任意機(jī)器上以111111密碼訪問(wèn),上面的執(zhí)行結(jié)果如下:

實(shí)際上,在user表中添加了一行,如上面標(biāo)注部分。如果你想允許用戶myuserip192.168.1.3的主機(jī)連接到mysql服務(wù)器,并使用mypassword作為密碼,執(zhí)行如下語(yǔ)句:

GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'192.168.1.3' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;

Mysql修改密碼:

UPDATE user SET password=password('111111') where user='root'; 

mysql> FLUSH privileges;

如下圖:

         說(shuō)明: C:\Users\roger\AppData\Roaming\Tencent\Users\455769859\QQ\WinTemp\RichOle\]T~OX)`1~3OC8XFW04KP9DI.jpg

請(qǐng)注意,此密碼是經(jīng)過(guò)hash后的密碼,不能用原密碼如mysql> update user set password = 111111 where user = 'root' ;這樣是不正確的。

Mysql添加用戶:

mysql> GRANT ALL PRIVILEGES ON *.* TO 'sphinx'@'%' IDENTIFIED BY '111111' WITH GRANT OPTION;                          

Query OK, 0 rows affected (0.00 sec)

 

mysql> FLUSH PRIVILEGES;                                                                   

Query OK, 0 rows affected (0.00 sec)

以上命令是創(chuàng)建sphinx用戶遠(yuǎn)程登錄mysql,密碼是111111

 

posted @ 2011-10-09 13:30 Roger 閱讀(2443) | 評(píng)論 (3)編輯 收藏

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美影院视频| 欧美一区二区三区的| 欧美日韩精品福利| 欧美片网站免费| 欧美女同在线视频| 欧美日韩综合| 国产精品视频午夜| 国产一区二区三区在线播放免费观看| 国内精品美女av在线播放| **性色生活片久久毛片| 亚洲另类视频| 午夜精品视频在线观看| 巨胸喷奶水www久久久免费动漫| 免费不卡中文字幕视频| 亚洲精品123区| 夜夜夜精品看看| 午夜国产精品视频免费体验区| 久久精品首页| 欧美日韩免费观看一区| 国产精品一二三四区| 亚洲国产精品一区二区第四页av| 亚洲精品午夜精品| 久久久精品网| 亚洲精品中文在线| 久久本道综合色狠狠五月| 欧美亚洲三区| 在线播放豆国产99亚洲| 一区二区三区 在线观看视频| 欧美一级成年大片在线观看| 欧美大片在线观看一区| 亚洲视频在线观看网站| 玖玖精品视频| 国产亚洲免费的视频看| 一区二区日韩精品| 欧美韩国日本一区| 欧美在线综合视频| 国产精品久久久久9999吃药| 最新中文字幕一区二区三区| 欧美一区亚洲二区| 99精品国产99久久久久久福利| 久久久精品国产免费观看同学| 国产精品v亚洲精品v日韩精品| 亚洲国产一区二区精品专区| 久久国产精品一区二区| 亚洲一区二区视频在线| 欧美日韩国产片| 亚洲电影免费观看高清完整版在线观看 | 一区二区三区精密机械公司 | 午夜精品福利一区二区蜜股av| 亚洲高清久久| 久久中文精品| 在线看片欧美| 奶水喷射视频一区| 久久夜色精品国产欧美乱极品| 国产精品一区在线观看| 亚洲欧美日本在线| 99综合在线| 欧美日韩精品欧美日韩精品 | 欧美激情一区二区三区不卡| 久久国产高清| 韩国精品主播一区二区在线观看| 久久精品人人做人人综合| 亚洲在线免费观看| 国产农村妇女精品一二区| 性欧美1819性猛交| 亚洲男女自偷自拍图片另类| 国产精品五月天| 久久精品国产亚洲一区二区| 欧美一区深夜视频| 合欧美一区二区三区| 久久精品道一区二区三区| 亚洲精选一区| 亚洲激情网站免费观看| 欧美大胆a视频| 亚洲精选一区| 亚洲视频你懂的| 国产欧美一级| 欧美阿v一级看视频| 欧美区日韩区| 欧美一级日韩一级| 久久久久久电影| 亚洲毛片一区二区| 一区二区三区回区在观看免费视频| 国产精品美女一区二区| 久久蜜桃精品| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲综合色激情五月| 国产一区二区三区久久久久久久久| 久久久在线视频| 欧美黄色影院| 欧美一区二区精品久久911| 久久久91精品国产| 中日韩美女免费视频网址在线观看| 亚洲资源在线观看| 亚洲成色999久久网站| 亚洲卡通欧美制服中文| 国产日韩免费| 亚洲美女91| 狠狠色丁香久久综合频道| 亚洲免费观看| 亚洲第一二三四五区| 一区二区三区欧美在线观看| 亚洲国产精品v| 亚洲欧美久久久久一区二区三区| 影音先锋久久精品| 亚洲伊人色欲综合网| 91久久夜色精品国产网站| 亚洲综合国产精品| 亚洲美女区一区| 欧美在线视频在线播放完整版免费观看 | 久久国产福利国产秒拍| 亚洲一区二区三区精品动漫| 久久久激情视频| 欧美一区二区免费观在线| 欧美黑人在线播放| 蜜桃av久久久亚洲精品| 国产日产亚洲精品系列| 99视频一区| 一本久久精品一区二区| 久久一区二区三区超碰国产精品| 欧美一级理论片| 国产精品视频免费观看www| 亚洲国产日韩欧美综合久久| 激情视频亚洲| 久久aⅴ国产欧美74aaa| 香蕉成人啪国产精品视频综合网| 欧美日韩在线播放三区| 亚洲精品九九| 日韩午夜av电影| 麻豆精品一区二区综合av| 久久精品免费播放| 国产亚洲综合性久久久影院| 亚洲一二三区精品| 亚洲一区二区三区成人在线视频精品| 欧美激情视频在线免费观看 欧美视频免费一 | 在线观看亚洲视频| 欧美在线你懂的| 久久亚洲精品伦理| 精品999成人| 久久亚洲春色中文字幕| 欧美寡妇偷汉性猛交| 亚洲韩国日本中文字幕| 欧美α欧美αv大片| 亚洲狠狠婷婷| 一区二区欧美日韩| 国产精品v片在线观看不卡| 亚洲香蕉视频| 久久深夜福利| 亚洲激情专区| 欧美日韩国产在线| 亚洲无吗在线| 久久精品在线| 亚洲国产精品久久| 欧美日韩国产一区二区三区| 亚洲小说区图片区| 久久一区二区三区av| 亚洲国产日日夜夜| 国产精品劲爆视频| 久久精品在线视频| 亚洲日本中文| 欧美在线啊v一区| 亚洲国产老妈| 欧美日韩亚洲激情| 羞羞视频在线观看欧美| 欧美国产一区二区| 亚洲欧美福利一区二区| 狠狠色伊人亚洲综合网站色| 欧美大胆成人| 亚洲欧美日韩国产中文在线| 免费在线播放第一区高清av| 一区二区三区高清在线| 国产一区二区三区精品欧美日韩一区二区三区 | 国产亚洲高清视频| 久久综合激情| 中国日韩欧美久久久久久久久| 久久久久9999亚洲精品| 亚洲精品综合在线| 国产亚洲一本大道中文在线| 欧美freesex8一10精品| 亚洲综合色噜噜狠狠| 亚洲国产精品成人久久综合一区| 亚洲一级片在线看| 亚洲国产欧美一区二区三区久久 | 亚洲高清自拍| 国产精品拍天天在线| 久色婷婷小香蕉久久| 亚洲综合色网站| 日韩视频一区二区在线观看| 久久亚洲私人国产精品va| 亚洲素人在线| 亚洲区一区二区三区| 国模叶桐国产精品一区| 国产精品v日韩精品v欧美精品网站| 蜜桃av久久久亚洲精品| 欧美亚洲一区| 亚洲一区三区电影在线观看| 亚洲精品一区二区三区四区高清 | 影音先锋日韩有码| 国产精品综合视频| 欧美日韩亚洲另类|