大致目錄構建如下:
├── uc-config.in : 用來生成配置環境信息的可執行程序
├── uc.pc.in : 用來生成配置環境信息的文件
├── uc.spec.in : 用來產生spec文件
├── autogen.sh : build工具
├── conf : 配置文件目錄
├── config.h.in : 一些編譯過程中的配置信息
├── configure : 配置工具
├── configure.ac : 形成build以及配置工具的文件
├── data : 數據目錄
├── doc : 文檔
├── Doxyfile.in : 生成Doxyfile的文件,主要用於doxygen的配置文件
├── include : 外部的頭文件,工程內的文件不要放入
├── lib : 外部的庫文件,工程內的庫不要放入
├── m4 : m4文件
├── scripts : 常使用的一些script,用於運轉系統
├── src : 源代碼目錄
│ ├── xxxMain.cpp : 用於產生xxx的gnome版本的源文件,含有main入口
│ ├── xxx.h : 用於外部開發的xxx介面
│ ├── xxxMain.cpp:用於產生xxx的kde版本,含有kde的main入口
│ ├── common : 普通的頭文件
│ │ ├── xxxdef.h : xxx的一般定義
│ │ ├── xxxrst.h : xxx的返回值類型定義
│ │ ├── xxxtypes.h : xxx的類型定義
│ │ ├── common.h : 共用頭文件,含有xxxdef.h、xxxrst.h和xxxtypes.h等頭文件
│ ├── network : 網路通訊庫
│ ├── ui : ui界面庫
│ │ ├── gnome : gnome界面庫,主要是gtk2的一些界面介面
│ │ ├── kde : kde界面庫,主要是qt的一些界面介面
│ └── util : 常用的一些共用庫
├── test : 單元測試
│ ├── dotest.cpp : 主要測試入口
│ ├── network
│ ├── template.cpp : 樣例模板 cpp 文件
│ ├── template.h : 樣例模板 頭文件
│ ├── ui
│ │ ├── gnome
│ │ └── kde
│ └── util
└── tools : 常使用的一些工具,用於維護系統
如何編寫configure.ac
configure.ac是產生configure以及automake重要文件,一般可以使用autoscan生成,這里就不太詳細描述,網上可以google到很多資料。
一般開發人員只需要使用autogen.sh,這個腳本會完成所有的automake以及autoconf的操作,雖然其中m4文件定義的宏非常重要,但是不需要開發人員完全讀懂,這里也不是關注的重點,等一步步的完全熟悉了,再過來了解也不遲。
這里項目中默認已經生成好了configure.ac。
如何編譯Makefile.am
開發人員重點關注的是Makefile.am,Makefile.am完全和Makefile的語法一樣,不過你可以寫少量的信息就足夠了。
如何編譯源文件
這里所指的源文件一般指c/c++源文件,對於java的源文件,我們將ant放入Makefile.am,道理一樣。編譯源文件一般有兩種方式,庫文件和可執行文件,而庫文件也有兩種方式,靜態庫文件和動態庫文件,一般靜態庫用:
lib_LIBRARIES = libcpthread.a
這種方式表示生成一個靜態庫,對應的源文件如何寫呢?
libcpthread_a_SOURCES = thread.cpp thread.h
當然對於一般頭文件可以忽略不寫,不過建議寫上,因為每個開發者都不是很規范,頭文件不僅僅只有申明,有的頭文件還會有實現。如果有多個cpp文件生成一個庫文件,則全部添加;如果有多個.a文件需要生成,只需要用空格隔開.a文件,相應的源文件對應到.a文件即可,如下所示:
lib_LIBRARIES = libcpthread1.a libcpthread2.a libcpthread2.a
那麼動態庫該如何寫呢?有人肯定會提到
lib_LIBRARIES = libcpthread.so
libcpthread_so_SOURCES = thread.cpp thread.h
不過可惜是錯誤的,這里順便提到一個libtool,主要用來生成靜態庫和動態庫的一個工具,不過在autogen.sh工具裡面已經包含。正確寫法如下:
lib_LTLIBRARIES = libcpthread.la
libcpthread_la_SOURCES = thread.cpp thread.h
有人看到這覺得很奇怪,為什麼要生成.la這個文件呢?.la文件內容如下:
# libcpthread.la - a libtool library file
# Generated by ltmain.sh - GNU libtool 1.5.6 (1.1220.2.95 2004/04/11 05:50:42)
#
# Please DO NOT delete this file!
# It is necessary for linking the library.
# The name that we can dlopen(3).
dlname='libcpthread-1.0.0.so.1'
# Names of this library.
library_names='libcpthread-1.0.0.so.1.0.0 libcpthread-1.0.0.so.1 libcpthread.so'
# The name of the static archive.
old_library='libcpthread.a'
# Libraries that this one depends upon.
dependency_libs=' -ldl /usr/lib64/libconfig++.la /usr/lib64/libconfig.la /usr/lib64/libchardet.la /usr/local/lib64/libalog.la -lz /usr/local/lib64/libanet.la -lpthread -lalog'
# Version information for libcpthread.
current=1
age=0
revision=0
# Is this an already installed library?
installed=no
# Should we warn about portability when linking against -moles?
shouldnotlink=no
# Files to dlopen/dlpreopen
dlopen=''
dlpreopen=''
# Directory that this library needs to be installed in:
libdir='/usr/lib'
看到了吧?裡面指定了關於靜態庫和動態庫的依賴等一系列的信息,具體還可以參考項目框架設計模式中庫公約的部分。
靜態文件和動態文件都會在當前目錄的.libs下,當然開發者也不需要關注庫文件本身,了解在這個路徑下即可。
可執行文件如何編譯呢?
bin_PROGRAMS = threadpool
threadpool_SOURCES = threadpoolMain.cpp
此處的bin_PROGRAMS會將程序安裝到${prefix}路徑下,如果不想安裝,可以採用:
noinst_PROGRAMS = testthreadpool
threadpool_SOURCES = threadpoolMain.cpp
同理,如果有多個cpp文件生成一個庫文件,則全部添加;如果有多個.la文件或者可執行文件需要生成,只需要用空格隔開.a文件,相應的源文件對應到.a文件即可,如下所示:
lib_LTLIBRARIES = libcpthread1.la libcpthread2.la libcpthread2.la
noinst_PROGRAMS = testthreadpool1 testthreadpool2 testthreadpool3
如果庫文件或者二進制文件有頭文件的申明依賴或追加一些編譯選項,則可以使用CFLAGS或CPPFLAGS,如下所示:
threadpool_CPPFLAGS = -I$(top_srcdir)/include/example.h
如果是java源文件,只需要遵循普通makefile寫法即可,如:
all: threadpool.jar
.PHONY: threadpool.jar clean
threadpool.jar:
@ant jar
clean:
ant clean
當然,ant需要配置好build.xml喲!
如何連接庫
連接庫的的時候,同樣也會有區分,工程外部的連接需使用LDFLAGS,如下所示:
libcpthread_la_LDFLAGS = -pthread
如果是內部庫,我們就直接使用.la文件,這樣在選擇靜態連接或者動態連接的時候,就給開發者很大的空間。值得注意的是,庫文件和二進制的內部庫連接宏並不相同,表現如下:
libcpthread_la_LIBADD = $(top_srcdir)/src/util/libutil.la
threadpool_LDADD = libcpthread.la
現在編譯和連接是否都了解了呢?
非編譯的一些開發
當創建一個腳本或配置文件的時候:
make dist
則形成一個.gz的壓縮包,但剛才創建的腳本或配置文件並沒有加入,於是:
EXTRA_DIST = conf/config.cfg
script/example.sh
即可將腳本或配置文件放入到壓縮包中;
若在多層目錄上的時候,還可以使用宏SUBDIRS指定內部編譯的順序(包括當前目錄),比如:
SUBDIRS = util /
thread /
. /
log
/
common
在編譯系統make的時候,會嚴格按照順序進行。
提供外部開發
如果工程完成了,別人想使用上面的庫文件進行二次開發,該如何做呢?
libcpthreadincludedir = $(includedir)/@PACKAGE_NAME@/util/thread
libcpthreadinclude_HEADERS = thread.h
這樣在編譯系統make install的時候,會將頭文件安裝到上面指定的目錄下,別人依照上面的build系統繼續下面的build了。
Ⅱ linux 命令中的sh是什麼意思
./a.sh會用你腳本中第一行的那個#!XXX的shell來執行語句
而sh a.sh則是用sh來執行語句
還有一種可能就是./a.sh確定了文件路徑,而sh a.sh一定要在a.sh所在目錄
Ⅲ linux 命令中的sh是什麼意思
1、sh是linux中運行shell的命令,抄是襲shell的解釋器,shell腳本是linux中殼層與命令行界面,用戶可以在shell腳本輸入命令來執行各種各樣的任務。
要運行shell腳本,首選需要給shell腳本許可權,這里里以hello.sh文件為例,首先需要按下「crtl+shift+T」打開終端窗口:
Ⅳ 怎麼在linux下創建一個可運行腳本
步驟:
1.新建一個.sh文件,touch test.sh
(4)linuxbuildsh擴展閱讀:
Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。
Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。
嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU工程各種工具和資料庫的操作系統。
腳本(Script)是使用一種特定的描述性語言,依據一定的格式編寫的可執行文件,又稱作宏或批處理文件。
Linux系統的shell作為操作系統的外殼,為用戶提供使用操作系統的介面。它是命令語言、命令解釋程序及程序設計語言的統稱。
shell是用戶和Linux內核之間的介面程序,如果把Linux內核想像成一個球體的中心,shell就是圍繞內核的外層。當從shell或其他程序向Linux傳遞命令時,內核會做出相應的反應。
shell是一個命令語言解釋器,它擁有自己內建的shell命令集,shell也能被系統中其他應用程序所調用。用戶在提示符下輸入的命令都由shell先解釋然後傳給Linux核心。
Ⅳ Linux下面如何運行 SH文件
本文介紹Linux下面用命令如何運行.sh文件的方法,有兩種方法:
一、直接./加上文件名.sh,如運行hello.sh為./hello.sh【hello.sh必須有x許可權】
二、直接sh 加上文件名.sh,如運行hello.sh為sh hello.sh【hello.sh可以沒有x許可權】
工具/原料
windows、linux
xshell
方法一:當前目錄執行.sh文件
1
【步驟一】cd到.sh文件所在目錄
比如以hello.sh文件為例,如下圖
注意事項
用「./」加文件名.sh執行時,必須給.sh文件加x執行許可權
如果對您有幫助,幫忙點「有得」,有助於您是我們進步的最大動力!
如果您喜歡,請點「投票」,您的參與是我們進步的最大動力!
如果您有疑問,請提交疑問,與您的互動是我們進步的最大動力!
僅供參考
Ⅵ h2資料庫在linux伺服器怎麼使用
簡單來說就是用jdbc:h2:mem:h2db來建立內存模式,並建表, 然後jdbc:h2:tcp://192.168.20.141:8082/mem:h2db來訪問上面的內存資料庫 package test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; imp...
Ⅶ Linux中的sh命令的詳細解釋
linxu下的sh命令相當於是shell命令語言的解釋器。下面由我為大家整理了linux的sh命令的詳細解釋的相關知識,希望對大家有幫助!
一、Linux中的sh命令的詳細解釋
sh命令是shell命令語言解釋器,執行命令從標准輸入讀取或從一個文件中讀取。通過用戶輸入命令,和內核進行溝通!Bourne Again Shell (即bash)是自由軟體基金會(GNU)開發的一個Shell,它是Linux系統中一個默認的Shell。Bash不但與Bourne Shell兼容,還繼承了C Shell、Korn Shell等優點。
語法
bash [options] [file]
選項
-c string:命令從-c後的字元串讀取。
-i:實現腳本交互。
-n:進行shell腳本的語法檢查。
-x:實現shell腳本逐條語句的跟蹤。
二、Linux中的sh命令的具體例子
使用-x選項跟蹤腳本調試shell腳本,能列印出所執行的每一行命令以及當前狀態:
[root@AY1307311912260196fcZ satools]# sh -x check_ssh_login.sh
+ DEFINE=30
+ cat /var/log/secure
+ awk '/Failed/ {++ip[$(NF-3)]} END {for (i in ip) print i"="ip[i]}'
++ cat /root/satools/black.txt
+ for i in '`cat /root/satools/black.txt`'
++ echo 121.42.0.16=1427
++ awk -F= '{print $1}' + IP=121.42.0.16
++ echo 121.42.0.16=1427
++ awk -F= '{print $2}'
+ NUM=1427
+ '[' 1427 -gt 30 ']'
+ grep 121.42.0.16 /etc/hosts.deny
+ '[' 1 -gt 0 ']'
+ echo sshd:121.42.0.16
+ echo vsftpd:121.42.0.16
+ for i in '`cat /root/satools/black.txt`'
++ echo 121.42.0.72=276
++ awk -F= '{print $1}'
+ IP=121.42.0.72
++ awk -F= '{print $2}'
++ echo 121.42.0.72=276
+ NUM=276 + '[' 276 -gt 30 ']'
+ grep 121.42.0.72 /etc/hosts.deny
+ '[' 1 -gt 0 ']'
+ echo sshd:121.42.0.72
+ echo vsftpd:121.42.0.72
三、Linux中對.sh文件的操作命令
1、創建test.sh文件
touch test.sh
2、編輯sh文件
vi test.sh
3、保存退出
敲擊esc, 然後輸入 :wq ,回車退出
4、添加可執行許可權,當然默認就是可執行的。
chmod +x test.sh
5、運行文件
(1)./test.sh
(2)sh test.sh
6、刪除文件
rm test.sh
Ⅷ 當linux執行./build.sh -p sun7i_android命令的時候shell腳本中哪個是$1,哪個是$2
-p 是$1
sun7i_android是$2
這里的1,2是指位置。