1. 關於VSCode的C/C++編譯問題,主要關於頭文件與庫的引用
你查一下有哪些包含.h文件的include文件夾 全部加到配置裡面就是了. 我的配置win10 + cygwin . 我只配置了win32節點
js">{
"configurations":[
{
"name":"Mac",
"includePath":[
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines":[],
"intelliSenseMode":"clang-x64",
"browse":{
"path":[
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders":true,
"databaseFilename":""
},
"macFrameworkPath":[
"/System/Library/Frameworks",
"/Library/Frameworks"
]
},
{
"name":"linux",
"includePath":[
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"defines":[],
"intelliSenseMode":"clang-x64",
"browse":{
"path":[
"/usr/include",
"/usr/local/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders":true,
"databaseFilename":""
}
},
{
"name":"Win32",
"includePath":[
"E:/Cygwin/usr/include",
"E:/cygwin/lib/gcc/i686-pc-cygwin/6.4.0/include",
"E:/cygwin/lib/gcc/i686-pc-cygwin/6.4.0/install-tools/include",
"${workspaceRoot}"
],
"defines":[
"_DEBUG",
"UNICODE"
],
"intelliSenseMode":"msvc-x64",
"browse":{
"path":[
"E:/Cygwin/usr/include",
"E:/cygwin/lib/gcc/i686-pc-cygwin/6.4.0/include",
"E:/cygwin/lib/gcc/i686-pc-cygwin/6.4.0/install-tools/include",
"${workspaceRoot}"
],
"limitSymbolsToIncludedHeaders":true,
"databaseFilename":""
}
}
],
"version":3
}
2. Linux下用gcc編譯C++文件時,所添加的庫是默認在哪個目錄下的我用的是Ubuntu12.10的系統。
Linux下函數默認將頭文件放到/usr/include/目錄下,庫文件放到/usr/lib/目錄下
來自課件,請採納
3. ubuntu 驅動編譯無法通過 求神來解決
復制代碼
1 #ifndef __KERNEL__
2 # define __KERNEL__
3 #endif
4 #ifndef MODULE
5 # define MODULE
6 #endif
7
8 // 下面的是主要的內容
9 #include <linux/kernel.h>
10 #include <linux/mole.h>
11 #include <linux/init.h>
12
13 MODULE_LICENSE("GPL");
14
15 static int year=2012;
16
17 int hello_init()
18 {
19 printk(KERN_WARNING "Hello kernel, it's %d!\n",year);
20 return 0;
21 }
22
23
24 void hello_exit()
25 {
26 printk("Bye, kernel!\n");
27 }
28
29 // 下面兩個為關鍵的模塊函數
30 mole_init(hello_init);
31 mole_exit(hello_exit);
復制代碼
如果上面的代碼看起來不太熟悉,那麼需要查看以下相關的書籍,比如《Linux設備驅動程序,第三版》,也就是大名鼎鼎的LDD;
2、老式驅動模塊編譯方法:
直接寫出make規則到makefile文件中,引用內核體系的頭文件路徑,舉例如下:
復制代碼
1 # The path of kernel source code
2 INCLUDEDIR = /media/GoldenResources/linux/linux-2.6.30/include
3
4 # Compiler
5 CC = gcc
6
7 # Options
8 CFLAGS = -D__KERNEL__ -DMODULE -O -Wall -I$(INCLUDEDIR)
9
10 # Target
11 OBJS = hello.o
12
13 all: $(OBJS)
14
15 $(OBJS): hello.c
16 $(CC) $(CFLAGS) -c $<
17
18 install:
19 insmod $(OBJS)
20
21 uninstall:
22 rmmod hello
23
24 .PHONY: clean
25 clean:
26 rm -f *.o
復制代碼
這里有我是用的一個linux內核源代碼路徑:/media/GoldenResources/linux/linux-2.6.30/include ,注意設置到正確的源碼路徑。
嘗試這編譯:
復制代碼
$make
gcc -D__KERNEL__ -DMODULE -O -Wall -I/media/GoldenResources/linux/linux-2.6.30/include -c hello.c
In file included from /media/GoldenResources/linux/linux-2.6.30/include/linux/kernel.h:11:0,
from hello.c:8:
/media/GoldenResources/linux/linux-2.6.30/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.
make: *** [hello.o] Error 1
復制代碼
4. Linux入門系列——軟體包管理
RedHat 系統中使用的是: rpm (redhat package manager) 現在稱:RPM is Package Manager
Debian : dpt
Ubuntu : apt
在安裝軟體的時候,有可能出現軟體包的相互依賴關系;所以紅帽公司推出了:yum(Yellowdog update modifier)
包的組成部分:
主包:
bind-9.7.1-1..e15.i586.rpm
子包:
bind-libs-9.7.1-1..e15.i586.rpm
bind-utils-9.7.1-1..e15.i586.rpm
包名:
PackageName-Version-Release.Arch.rpm
bind-major-minor-releases-release.arch.rpm
包名-主版本號-次版本號-發行號-rpm包的製作者的發行號.硬體平台.rpm
主版本號:重大改進;
次版本號:某個子功能發生重大變化;
發行號:修改BUG,調整了一點功能;
bind-9.7.1-1.noarch.rpm 這里的noarch表示不區分硬體平台,32和64都可以使用;如果是ppc則是在PowerPc上使用的包;
# rpm -ivh /path/to/Package_Name
-i,--install 表示安裝
-v 表示顯示安裝過程的信息
-h 表示以#顯示安裝的進程,總數為50個;
-vv 顯示更詳細的過程;
--nodeps 安裝的時候忽略依賴關系;
--force 無論之前是否安裝過,都強制安裝,可以實現重裝、降級;
--replacepkgs 重新安裝,替換原有的安裝;
--oldpackage 對軟體包進行降級;
--test Do not install the package, simply check for and report potential conflicts. 不進行安裝,只測試看在安裝的時候有沒有依賴包要裝;
rpm -q soft_name
# rpm -q httpd
rpm -qa 查詢當前系統中已經安裝的rpm軟體包;
# rpm -qa |grep 『ssh*』
rpm -qi soft_name 查詢軟體包的安裝信息:
[root@ns2 rpm]# rpm -qi zlib-devel
Name : zlib-devel Relocations: /usr
Version : 1.2.3 Vendor: CentOS
Release : 4.el5 Build Date: 2011年05月11日 星期三 18時57分15秒
Install Date: 2013年07月21日 星期日 17時02分41秒 Build Host: builder10.centos.org
Group : Development/Libraries Source RPM: zlib-1.2.3-4.el5.src.rpm
Size : 269981 License: BSD
Signature : DSA/SHA1, 2011年09月04日 星期日 03時24分25秒, Key ID a8a447dce8562897
URL : http://www.gzip.org/zlib/
Summary : Zlib 開發的頭文件和庫。
Description :
zlib-devel 軟體包包括開發使用 zlib 壓縮和解縮庫的程序
所需的頭文件和庫。
[root@ns2 rpm]#
rpm -ql soft_name 查看該軟體包在系統中存放了哪些文件;
rpm -qf /path/to/file_name 查看該文件是由哪個rpm包生成的。
rpm -qc soft_name 查看指定rpm包安裝的配置文件的位置;
rpm -qd soft_name 查看指定rpm包安裝的幫助文件的位置;
rpm -q --scripts soft_name 查看指定rpm包在安裝、卸載、更新的前後,所要執行的shell腳本;
rpm -qp[i|l|d|c|] 即要加上一個「p」選項;
rpm -Uvh /path/to/package_name
如果安裝的指定的軟體包已經安裝過,則進行升級操作,如果沒有安裝過,則就使用指定的這個軟體包進行安裝;
rpm -Fvh /path/to/package_name
如果安裝過,則升級,否則不進行任何操作;
rpm -Fvh --oldpackage package_name 通常用這個來降級一個rpm包;
rpm -e package_name
--nodeps 強制卸載
rpm -V package_name 也可以使用--verify
通常用來檢查安裝後的文件是不是被修改過;
加密演算法:
對稱加密: 加密和解密使用同一個key
非對稱加密:有一對密鑰(公鑰和私鑰),公鑰大家都可以知道,私鑰只有持有人知道;公鑰加密私鑰解,私鑰加密公鑰也可以解。不能由公鑰摧出私鑰,也不能由私鑰摧出公鑰;私鑰還用來做簽名,因為只有私鑰持有人自己才有;
單向加密:使用這種加密演算法加密後,是不可以再還原的。通常用它來做數據完整性的驗證,也就是驗證數據在傳輸的過程中有沒有被別人修改過。
在紅帽的系統中,/etc/pki/rpm-gpg/目錄下面存放了紅帽公司的gpg-key(相當於公鑰),所以只需要把這個gpgkey導入到系統中就可以驗證了。導入方法如下:
# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
接下來就可以對將要安裝的rpm包進行驗證了:
# rpm -K /path/to/package_file
dsa,gpg驗證來源的合法性,也就是驗證簽名。但是可以使用--nosignature 來跳過簽名驗證;
sha1,md5驗證軟體包的完整性,可以使用--nodigest 來跳過完整性驗證;
rpm --rebuilddb 重建資料庫
--initdb 初始化資料庫
yum install -y pack1 pack2 安裝指定的軟體包
yum remove pack1 pack2 -y 刪除指定的軟體包
yum update pack1 pack2 更新指定的軟體包
yum list installed 列出所有已經安裝的軟體包
yum update 更新源
yum search string 搜索包含string的軟體包
yum install package_name 獲取軟體包信息
# tar zxf nginx-1.4.7.tar.gz -C /usr/src
# configure --prefix=/usr/local/nginx --conf-path=/etc
# make
# make install
由於使用的是源碼包安裝在非正常路徑下。所以還要做以下的調整:
修改/etc/profile文件。或是在/etc/profile.d/下創建一個以.sh結尾的文件;再把二進製程序的路徑export出來就行了;
在/etc/ld.so.conf.d/中創建一個以.conf文件結尾的文件,而後把要增添的路徑直接寫入此文件中就行了;
這樣系統就會在下次啟動的時候,自動載入這些新增加的庫;如果想讓系統馬上可以找到這些新增加的庫,就必須執行下面的命令:
# ldconfig 通知系統重新搜索庫文件,還可以加上-v選項,表示顯示過程;
默認的頭文件搜索路徑是:/usr/include/
要添加新的頭文件搜索路徑,可以使用鏈接的方式:
ln -s /usr/local/nginx/include/* /usr/include/
或
ln -s /usr/local/nginx/include /usr/include/nginx
這時可以修改/etc/man.conf文件,在裡面添加以下內容:
MANPATH /usr/local/nginx/man
還有一種方式就是臨時使用:
# man -M /usr/local/nginx/man nginx 這樣就可以查看nginx的man手冊了;