文章目錄 1.MySQL:decimal,find . .-print 2.PostgreSQL:$ 3.環境變量:tnsnames.ora,curl 3.1 對單一用戶生效: .bash_profile是oracle安裝解壓縮好的文件,一般要自己配置 3.2 對所有用戶有效:不在同一網段內稱遠程,與數據庫連接也是tcp連接和ssh連服務器一樣 4.動靜態庫:.a,指定.so,LD_ 4.1 源代碼組織:公用的自定義函數和類從主程序中分離出來:函數和類的聲明在頭文件中,定義在程序文件中,主程序中要包含頭文件,編譯時要和程序文件一起編譯 4.2 靜態庫:鏈接庫的文件名是libpublic.a,但鏈接庫名是”public”,不是“libpublic.a” 4.3 動態庫:動態庫發生改變,程序不需要重新編譯,所以動態庫升級比較方便 5.Linux中文字符集:/etc/locale.conf 6.Oracle的字符集:NLS_LANG 6.1 服務端的字符集:Oracle數據庫實例創建后,如果沒有開始業務運行,可修改字符集,如果已經業務化運行,不建議修改字符集,會造成數據中的漢字亂碼 6.2 客戶端的字符集:Linux/Windows 7. linux文件編碼轉換:iconv,enca
1.MySQL:decimal,find . .-print
如下是centos6安裝mysql。 如下select…from user是查看用戶字典。 如下賦予所有的權限允許所有主機遠程訪問。客戶端Navicat Premium可訪問mysql數據庫鏈接:鏈接:https://pan.baidu.com/s/1otzYSvY5d08IZ5S5J-Tkzw 提取碼:leof 。 service iptables stop再telnet 192…3306。 oracle字段說明文字放外面,mysql字段說明文字放create table里面。mysql本身自增列字段意義不大,沒有序列生成器但可模擬出:https://www.runoob.com/mysql/mysql-using-sequences.html。如下修改mysql字符集,大寫P指端口,小寫p指密碼。 以下在本地虛擬機中修改mysql字符集,如下最后一行是自己添加的。 如下封裝MySQL訪問接口。
# mysql 頭文件存放路徑
MYSQLINCL
= - I
/ usr
/ include
/ mysql
# mysql 庫文件保存路徑
MYSQLLIB
= - L
/ usr
/ lib64
/ mysql
# mysql 鏈接庫
MYSQLLIBS
= - lmysqlclient
# CFLAGS = - O2
CFLAGS
= - O2
- WallCFLAGS
= - g
- Wno
- write
- strings all
: createtable inserttable selecttable updatetable deletetable createtable
: createtable
. cpp _mysql
. h _mysql
. cppg
++ $
( CFLAGS
) - o createtable createtable
. cpp $
( MYSQLINCL
) $
( MYSQLLIB
) $
( MYSQLLIBS
) _mysql
. cpp
- lm
- lcinserttable
: inserttable
. cpp _mysql
. h _mysql
. cppg
++ $
( CFLAGS
) - o inserttable inserttable
. cpp $
( MYSQLINCL
) $
( MYSQLLIB
) $
( MYSQLLIBS
) _mysql
. cpp
- lm
- lcselecttable
: selecttable
. cpp _mysql
. h _mysql
. cppg
++ $
( CFLAGS
) - o selecttable selecttable
. cpp $
( MYSQLINCL
) $
( MYSQLLIB
) $
( MYSQLLIBS
) _mysql
. cpp
- lm
- lcupdatetable
: updatetable
. cpp _mysql
. h _mysql
. cppg
++ $
( CFLAGS
) - o updatetable updatetable
. cpp $
( MYSQLINCL
) $
( MYSQLLIB
) $
( MYSQLLIBS
) _mysql
. cpp
- lm
- lcdeletetable
: deletetable
. cpp _mysql
. h _mysql
. cppg
++ $
( CFLAGS
) - o deletetable deletetable
. cpp $
( MYSQLINCL
) $
( MYSQLLIB
) $
( MYSQLLIBS
) _mysql
. cpp
- lm
- lcclean
: rm
- rf createtable inserttable selecttable updatetable deletetable
make后./createtable oracle用to_date,mysql用str_to_data如下
# include "_mysql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "127.0.0.1,root,123qweASD!@#,mysql,3306" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; stmt
. prepare ( "\create table goods(id bigint(10),\name varchar(30),\sal decimal(8,2),\btime datetime,\memo longtext,\pic longblob,\primary key (id))" ) ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "create table goods ok.\n" ) ; return 0 ;
}
# include "_mysql.h"
struct st_GOODS
{ long id
; char name
[ 31 ] ; double sal
; char btime
[ 20 ] ; char t
[ 15 ] ;
} stgoods
; int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "127.0.0.1,root,123qweASD!@#,mysql,3306" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; stmt
. prepare ( "\insert into goods(id,name,sal,btime,t) \values(:1,:2,:3,str_to_date(:4,'%%Y-%%m-%%d %%h:%%i:%%s'),to_null(:5))" ) ; stmt
. bindin ( 1 , & stgoods
. id
) ; stmt
. bindin ( 2 , stgoods
. name
, 30 ) ; stmt
. bindin ( 3 , & stgoods
. sal
) ; stmt
. bindin ( 4 , stgoods
. btime
, 19 ) ; stmt
. bindin ( 5 , stgoods
. t
, 10 ) ; for ( int ii
= 1 ; ii
<= 10 ; ii
++ ) { memset ( & stgoods
, 0 , sizeof ( stgoods
) ) ; stgoods
. id
= ii
; sprintf ( stgoods
. name
, "商品名稱%02d" , ii
) ; stgoods
. sal
= ii
* 2.11 ; strcpy ( stgoods
. btime
, "2018-03-01 12:25:31" ) ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "insert ok(id=%d).\n" , ii
) ; } printf ( "insert table goods ok.\n" ) ; conn
. commit ( ) ; return 0 ;
}
# include "_mysql.h"
struct st_GOODS
{ long id
; char name
[ 31 ] ; double sal
; char btime
[ 20 ] ;
} stgoods
; int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "127.0.0.1,root,123qweASD!@#,mysql,3306" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; stmt
. prepare ( "\select id,name,sal,date_format(btime,'%%Y-%%m-%%d %%h:%%i:%%s')\from goods where id>? and id<?" ) ; stmt
. bindin ( 1 , & iminid
) ; stmt
. bindin ( 2 , & imaxid
) ; stmt
. bindout ( 1 , & stgoods
. id
) ; stmt
. bindout ( 2 , stgoods
. name
, 30 ) ; stmt
. bindout ( 3 , & stgoods
. sal
) ; stmt
. bindout ( 4 , stgoods
. btime
, 19 ) ; iminid
= 1 ; imaxid
= 8 ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } while ( 1 ) { memset ( & stgoods
, 0 , sizeof ( stgoods
) ) ; if ( stmt
. next ( ) != 0 ) break ; printf ( "id=%ld,name=%s,sal=%.02f,btime=%s\n" , stgoods
. id
, stgoods
. name
, stgoods
. sal
, stgoods
. btime
) ; } printf ( "本次查詢了goods表%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; return 0 ;
}
# include "_mysql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "127.0.0.1,root,123qweASD!@#,mysql,3306" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; char strbtime
[ 20 ] ; stmt
. prepare ( "\update goods set btime=str_to_date(:1,'%%Y-%%m-%%d %%h:%%i:%%s') where id>:2 and id<:3" ) ; stmt
. bindin ( 1 , strbtime
, 19 ) ; stmt
. bindin ( 2 , & iminid
) ; stmt
. bindin ( 3 , & imaxid
) ; iminid
= 1 ; imaxid
= 5 ; memset ( strbtime
, 0 , sizeof ( strbtime
) ) ; strcpy ( strbtime
, "2017-12-20 09:45:30" ) ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "本次更新了goods表%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; conn
. commit ( ) ; return 0 ;
}
# include "_mysql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "127.0.0.1,root,123qweASD!@#,mysql,3306" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; stmt
. prepare ( "delete from goods where id>:1 and id<:2" ) ; stmt
. bindin ( 1 , & iminid
) ; stmt
. bindin ( 2 , & imaxid
) ; iminid
= 1 ; imaxid
= 5 ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "本次從goods表中刪除了%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; conn
. commit ( ) ; return 0 ;
}
以下在mysql中,mysql區分空值和null值(空值不占空間,null值占空間)。如下指定c1數字型字段不是char字符串字段,如果數字遇到空值(不是null值)解析到結構體里,程序bindin插入自動轉為0,所以只能在程序里拼成sql效率低。 以下在oracle中,希望字段為空或數字變量的話,一般會用空的字符串去綁定bindin表的字段。這種方法在mysql中不行。
2.PostgreSQL:$
centos7安裝:https://blog.csdn.net/zll_0405/article/details/81197633。 如上設置好字符集,如下啟動pg數據庫,切換到pg用戶并登錄。 如下windows客戶端連接數據庫,如下修改pg_hba.conf放開對客戶端ip限制并重啟服務端。 PostgreSQL數據類型和序列生成器。 以下在oracle中不允許。 以下在pg中允許。 如下regclass表示第二列不管。不需要用表的觸發器得到序列值,序列生成器就行。
# postgresql 頭文件存放路徑
PGINCL
= - I
/ usr
/ include
# postgresql 庫文件保存路徑
PGLIB
= - L
/ usr
/ lib64
# postgresql 鏈接庫
PGLIBS
= - lpq
# CFLAGS = - O2
CFLAGS
= - O2
- Wall
# CFLAGS = - g - Wall
CFLAGS
= - g
- Wno
- write
- stringsall
: createtable inserttable selecttable updatetable deletetablecreatetable
: createtable
. cpp _postgresql
. h _postgresql
. cppg
++ $
( CFLAGS
) - o createtable createtable
. cpp _postgresql
. cpp $
( PGINCL
) $
( PGLIB
) $
( PGLIBS
) - lm
- lcinserttable
: inserttable
. cpp _postgresql
. h _postgresql
. cppg
++ $
( CFLAGS
) - o inserttable inserttable
. cpp _postgresql
. cpp $
( PGINCL
) $
( PGLIB
) $
( PGLIBS
) - lm
- lcselecttable
: selecttable
. cpp _postgresql
. h _postgresql
. cppg
++ $
( CFLAGS
) - o selecttable selecttable
. cpp _postgresql
. cpp $
( PGINCL
) $
( PGLIB
) $
( PGLIBS
) - lm
- lcupdatetable
: updatetable
. cpp _postgresql
. h _postgresql
. cppg
++ $
( CFLAGS
) - o updatetable updatetable
. cpp _postgresql
. cpp $
( PGINCL
) $
( PGLIB
) $
( PGLIBS
) - lm
- lcdeletetable
: deletetable
. cpp _postgresql
. h _postgresql
. cppg
++ $
( CFLAGS
) - o deletetable deletetable
. cpp _postgresql
. cpp $
( PGINCL
) $
( PGLIB
) $
( PGLIBS
) - lm
- lcclean
: rm createtable inserttable selecttable updatetable deletetable
# include "_postgresql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; stmt
. prepare ( "\create table goods(id int,\name varchar(30),\sal numeric(8,2),\btime timestamp,\memo text,\pic bytea)" ) ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } conn
. commitwork ( ) ; printf ( "create table goods ok.\n" ) ; return 0 ;
}
# include "_postgresql.h"
struct st_GOODS
{ long id
; char name
[ 31 ] ; double sal
; char btime
[ 20 ] ;
} stgoods
; int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; stmt
. prepare ( "\insert into goods(id,name,sal,btime)\values(:1,:2,:3,to_timestamp(:4,'yyyy-mm-dd hh24:mi:ss'))" ) ; stmt
. bindin ( 1 , & stgoods
. id
) ; stmt
. bindin ( 2 , stgoods
. name
, 30 ) ; stmt
. bindin ( 3 , & stgoods
. sal
) ; stmt
. bindin ( 4 , stgoods
. btime
, 19 ) ; for ( int ii
= 1 ; ii
<= 10 ; ii
++ ) { memset ( & stgoods
, 0 , sizeof ( stgoods
) ) ; stgoods
. id
= ii
; sprintf ( stgoods
. name
, "商品名稱%02d" , ii
) ; stgoods
. sal
= ii
* 2.11 ; strcpy ( stgoods
. btime
, "2018-03-01 12:25:31" ) ; if ( stmt
. execute ( ) != 0 ) {
printf ( "id=%d\n" , stgoods
. id
) ; printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "insert ok(id=%d).\n" , ii
) ; } printf ( "insert table goods ok.\n" ) ; conn
. commitwork ( ) ; return 0 ;
}
# include "_postgresql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; char strbtime
[ 20 ] ; stmt
. prepare ( "\update goods set btime=to_date(:1,'yyyy-mm-dd hh24:mi:ss') where id>:2 and id<:3" ) ; stmt
. bindin ( 1 , strbtime
, 19 ) ; stmt
. bindin ( 2 , & iminid
) ; stmt
. bindin ( 3 , & imaxid
) ; iminid
= 1 ; imaxid
= 5 ; memset ( strbtime
, 0 , sizeof ( strbtime
) ) ; strcpy ( strbtime
, "2017-12-20 09:45:30" ) ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "本次更新了goods表%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; conn
. commitwork ( ) ; return 0 ;
}
# include "_postgresql.h"
struct st_GOODS
{ long id
; char name
[ 31 ] ; double sal
; char btime
[ 20 ] ;
} stgoods
; int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; stmt
. prepare ( "\select id,name,sal,to_char(btime,'yyyy-mm-dd hh24:mi:ss')\from goods where id>:1 and id<:2" ) ; stmt
. bindin ( 1 , & iminid
) ; stmt
. bindin ( 2 , & imaxid
) ; stmt
. bindout ( 1 , & stgoods
. id
) ; stmt
. bindout ( 2 , stgoods
. name
, 30 ) ; stmt
. bindout ( 3 , & stgoods
. sal
) ; stmt
. bindout ( 4 , stgoods
. btime
, 19 ) ; iminid
= 1 ; imaxid
= 8 ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } while ( 1 ) { memset ( & stgoods
, 0 , sizeof ( stgoods
) ) ; if ( stmt
. next ( ) != 0 ) break ; printf ( "id=%ld,name=%s,sal=%.02f,btime=%s\n" , stgoods
. id
, stgoods
. name
, stgoods
. sal
, stgoods
. btime
) ; } printf ( "本次查詢了goods表%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; return 0 ;
}
# include "_postgresql.h"
int main ( int argc
, char * argv
[ ] )
{ connection conn
; if ( conn
. connecttodb ( "host=118.89.50.198 user=postgres password=pwdidc dbname=postgres port=5432" , "gbk" ) != 0 ) { printf ( "connect database failed.\n%s\n" , conn
. m_cda
. message
) ; return - 1 ; } sqlstatement
stmt ( & conn
) ; int iminid
, imaxid
; stmt
. prepare ( "delete from goods where id>:1 and id<:2" ) ; stmt
. bindin ( 1 , & iminid
) ; stmt
. bindin ( 2 , & imaxid
) ; iminid
= 1 ; imaxid
= 5 ; if ( stmt
. execute ( ) != 0 ) { printf ( "stmt.execute() failed.\n%s\n%s\n" , stmt
. m_sql
, stmt
. m_cda
. message
) ; return - 1 ; } printf ( "本次從goods表中刪除了%ld條記錄。\n" , stmt
. m_cda
. rpc
) ; conn
. commitwork ( ) ; return 0 ;
}
3.環境變量:tnsnames.ora,curl
/etc/profile,/etc/bashrc 是系統全局環境變量設定。~/.profile, ~/.bashrc用戶家目錄下的私有環境變量設定。 用bash調用腳本的時候會創建一個和自己一模一樣的shell子進程來執行這個外部命令。這個子進程中設置了自己的運行的環境變量。而在此時,父進程的環境變量并沒有改變。bash test.sh == ./test.sh。
用source來執行腳本的時候,不會創建子進程,而是在父進程中直接執行。所以當需要程序修改當前shell本身的環境變量的時候,使用source命令。source test.sh == . test.sh。加載運行config配置文件用source命令配置主進程環境信息。如下記住ebe,從大到小。 上面就是改變linux的env的三種方法,每個用戶env都不一樣,env中HOME為用戶主目錄。 export在命令行單獨輸入是臨時的(export…,env可查到多出了剛export的,但用戶登出再登錄,env查看沒有剛export的)。但在.bash_profile中都含有export,用戶一登錄就執行.bash_profile,所以env中含有這些環境變量,這樣export可視為永久。 本地(客戶端)連虛擬機顯示本地局域網ip(cmd中ifconfig查看)。 本地(客戶端)連互聯網顯示本地出口ip(cmd中curl ipinfo.io查看)。 所有可執行程序都要PATH指定,如ls,pwd(也是可執行程序)不加./(./是在當前目錄執行),因為在冒號分隔(冒號不是連接)的幾個目錄下找。sqlplus命令行命令在/oracle/bin中,PATH在env中可查看。 ls這個可執行程序就是在bin目錄下,上面PATH已指定。如下若未改為英文顯示:未找到命令(中文)。
3.1 對單一用戶生效: .bash_profile是oracle安裝解壓縮好的文件,一般要自己配置
如下必須在用戶主目錄/oracle,才能vi .bash_profile。
3.2 對所有用戶有效:不在同一網段內稱遠程,與數據庫連接也是tcp連接和ssh連服務器一樣
/etc/profile 是文件(里面有不建議在這文件里修改的英文說明), /etc/profile.d/ 是目錄(如下新建.sh文件創建全局環境變量)。 如下在sss.sh中寫入下行。 不想要什么變量直接刪除 /etc/profile.d/ 下對應的shell 腳本即可,當用戶重新登錄shell如下或source /etc/profile 時會觸發。 在/etc/profile這個文件中有這么一段shell:for i in /etc/profile.d/*.sh;,會在每次啟動時自動加載profile.d目錄中每個配置。 如上tnsnames.ora是配置oracle數據庫連接參數,snorcl11g_198是客戶端配置的網絡服務名不是實例名。su - oracle切換用戶相當于用oracle登錄(會執行.bash_profile文件)有oracle的環境變量,su oracle不會改變原來環境變量(不調用環境,只是權限切換)。crontab -e不會有shell環境變量,有與數據庫相關的C程序需和環境變量相關不能放入crontab -e調度。oracle用戶目錄下有home和base,home/bin里有一些應用程序命令sqlplus,dbstart。base/oradata/snorcl11g/數據文件。
4.動靜態庫:.a,指定.so,LD_
4.1 源代碼組織:公用的自定義函數和類從主程序中分離出來:函數和類的聲明在頭文件中,定義在程序文件中,主程序中要包含頭文件,編譯時要和程序文件一起編譯
# ifndef PUBLIC_H
# define PUBLIC_H 1
# include <stdio.h>
void func ( ) ;
# endif
# include "public.h"
void func ( )
{ printf ( "我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。\n" ) ;
}
# include "public.h"
int main ( )
{ func ( ) ;
}
g
++ - o book265 book265
. cpp public
. cpp
. / book265
我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。
公用函數庫的public.cpp是源代碼,對任何人可見,實際開發出于技術保密,開發者并不希望提供公用函數庫源代碼。C/C++提供了一個保證代碼安全性方法,把公共程序文件public.cpp編譯成庫(庫分為靜態庫與動態庫)。庫是一種可執行代碼的二進制形式,可以與其它的源程序一起編譯,也可以被操作系統載入內存執行。
4.2 靜態庫:鏈接庫的文件名是libpublic.a,但鏈接庫名是”public”,不是“libpublic.a”
如下優點是在編譯后的可執行程序可以獨立運行,因為所使用的函數都已經被編譯進去了。缺點如果所使用的靜態庫發生更新改變,我們的程序必須重新編譯,靜態庫文件名的命名方式是“libxxx.a”。
gcc
- c
- o libpublic
. a public
. cpp
使用靜態庫的方法一,直接把調用者源代碼和靜態庫文件名一起編譯:
g
++ - o book265 book265
. cpp libpublic
. a
使用靜態庫的方法二,采用L參數指定靜態庫文件的目錄,-l參數指定靜態庫名:
g
++ - o book265 book265
. cpp
- L
/ home
/ w
/ demo
- lpublic
. / book265
我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。
如果要指定多個靜態庫文件的目錄,用法是“-L/目錄1 -L目錄2 -L目錄3”;如果要指定多個靜態庫,用法是“-l庫名1 -l庫名2 -l庫名3”。
4.3 動態庫:動態庫發生改變,程序不需要重新編譯,所以動態庫升級比較方便
g
++ - fPIC
- shared
- o libpublic
. so public
. cpp
使用動態庫的方法與使用靜態庫的方法相同。如果在動態庫文件和靜態庫文件同時存在,優先使用動態庫編譯:
g
++ - o book265 book265
. cpp
- L
/ home
/ w
/ demo
- lpublic
執行程序./book265時,出現以下提示:/book265: error while loading shared libraries: libpublic.so: cannot open shared object file: No such file or directory,因為采用了動態鏈接庫的可執行程序在運行時需要指定動態庫文件的目錄,Linux系統中采用LD_LIBRARY_PATH環境變量指定動態庫文件的目錄。采用以下命令設置LD_LIBRARY_PATH環境變量。
export LD_LIBRARY_PATH
= / home
/ w
/ demo
: .
注意:如果要指定多個動態庫文件的目錄,用法是“export LD_LIBRARY_PATH=目錄1:目錄2:目錄3:.”,目錄之間用半角的冒號分隔,最后的圓點指當前目錄。接下來修改動態庫中func函數的代碼:
printf ( "我心匪石,不可轉也。我心匪席,不可卷也。威儀棣棣,不可選也。\n" ) ;
改為
printf ( "生活美好如鮮花,不懂享受是傻瓜;\n" ) ;
printf ( "傻呀傻呀傻呀傻,比不上小鳥和烏鴉。\n" ) ;
printf ( "芳草地啊美如畫,誰要不去是傻瓜;\n" ) ;
printf ( "我是一只傻傻鳥,獨在枯枝丫上趴。\n" ) ;
重新編譯動態庫,無需重新編譯book265,直接執行程序
g
++ - fPIC
- shared
- o libpublic
. so public
. cpp
. / book265
生活美好如鮮花,不懂享受是傻瓜;
傻呀傻呀傻呀傻,比不上小鳥和烏鴉。
芳草地啊美如畫,誰要不去是傻瓜;
我是一只傻傻鳥,獨在枯枝丫上趴。
5.Linux中文字符集:/etc/locale.conf
1、查看當前系統已安裝的字符集 (1)locale命令用于查看當前系統全部的已安裝的字符集,Linux支持的符集約800種: locale -a (2)查看已安裝的中文字符集(只查看中國大陸的,不包括香港和臺灣): locale -a|grep zh_CN,下圖表示已經安裝了中文字符集。 2.安裝中文字符集 如果您的Linux系統沒有安裝中文字符集,可以用yum命令安裝。安裝中文字符集軟件包的方法比較多,沒找到準確的說法,所以把多種方法都寫了進來,以下命令都可以執行,不會有副作用: yum -y groupinstall chinese-support yum -y install chinese-support yum -y install kde-l10n-Chinese yum -y install ibus-table-chinese-1.4.6-3.el7.noarch 安裝后,執行locale -a|grep zh_CN,如果顯示的內容如下,表示安裝成功。 3.修改字符集配置文件 CentOS6.x字符集配置文件在/etc/sysconfig/i18n文件中。 CentOS7.x字符集配置文件在/etc/locale.conf文件中,內容如下: 執行以下命令或者重啟系統使修改生效: CentOS6.x:source /etc/sysconfig/i18n CentOS7.x:source /etc/locale.conf
4.centos7修改 /etc/locale.conf 不生效 centos7的語言環境變量是通過/etc/profile.d/lang.sh加載locale.conf來設置的。我在修改 /etc/locale.conf 內容為 LANG=“zh_CN.UTF-8” 并重啟后發現并沒有什么效果。local得出的依然是默認的en_US。于是我去檢查lang.sh的代碼。發現中間有一段是這樣的: 可以看到,當變量為zh*的時候,依然將LANG賦值為en_US.UTF-8。不知道官方為什么會采用這種默認設置,所以我將代碼改成這樣。重啟之后,再次查看locale,就好了。
6.Oracle的字符集:NLS_LANG
6.1 服務端的字符集:Oracle數據庫實例創建后,如果沒有開始業務運行,可修改字符集,如果已經業務化運行,不建議修改字符集,會造成數據中的漢字亂碼
1.查看服務端字符集 執行以下SQL可以查看服務端的字符集: select * from NLS_DATABASE_PARAMETERS where parameter like ‘%CHARACTERSET%’; 執行以下SQL也可以查看服務端的字符集: select userenv(‘language’) from dual; 2.修改服務端字符集 用DBA權限,執行以下步驟修改Oracle數據庫的字符集(例如修改為ZHS16GBK)。 (1)修改服務端操作系統的NLS_LANG環境變量: export NLS_LANG=‘Simplified Chinese_China.ZHS16GBK’ (2)關閉Oracle數據庫: shutdown immediate; (3)把數據庫啟動到mount狀態: startup mount; (4)把數據庫改為restricted模式: alter system enable restricted session; alter system set job_queue_processes=0; alter system set aq_tm_processes=0; (5)打開數據庫: alter database open; (6)修改數據庫的字符集。 alter database character set internal_use ZHS16GBK; (7)重啟數據庫: shutdown immediate; startup;
6.2 客戶端的字符集:Linux/Windows
1.Linux環境 Oracle客戶端的字符集必須與服務端相同,否則中文會出現亂碼,客戶端的字符集由NLS_LANG環境變量控制。 (1)查看NLS_LANG環境變量。 env|grep NLS_LANG (2)設置環境變量 修改環境變量參數文件(系統或用戶的profile文件)。 export NLS_LANG=‘Simplified Chinese_China.ZHS16GBK’
2.Windows環境 打開注冊表( 執行regedit.exe) HKEY_LOCAL_MACHINE -> SOFTWARE -> ORACLE -> KEY_OraClient11g_home1
7. linux文件編碼轉換:iconv,enca
第一種:iconv命令用于文件編碼的轉換,碰到gbk編碼的文件,需要轉換成utf8,直接使用該命令即可。iconv --list :列出iconv支持的編碼列表。iconv -f 原編碼 -t 新編碼 filename -o newfile。 -f : from 來源編碼 -t : to 轉換后新編碼 -c: 忽略無效字符 -s: --silent,忽略警告 -o file : 可選,沒有的話直接轉換當前文件, 使用-o 保留源文件 第二種:linux安裝enca,多文件轉編碼:
enca
- v
wget http
:
tar
- zxvf enca
- 1.13 . tar
. gz
cd enca
- 1.13
. / configure
make
make check
make install
enca
- L zh_CN filename
enca `ls`
enca
- L zh_CN
- x UTF
- 8 filename
enca
- x utf
- 8 *
與50位技術專家面對面 20年技術見證,附贈技術全景圖
總結
以上是生活随笔 為你收集整理的【C/C++10】天气APP:MySQL/PostgreSQL,环境变量/动静态库,Linux/Oracle字符集 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。