一、 C標准庫頭文件,以及Linux的標准庫文件的對應頭文件,默認放在/usr/include下。 如圖:
標識出回了最常用的幾答個頭文件。
二、 自定義頭文件,或者集成頭文件,需要在編譯的時候指定。可以在命令行中指定,也可以在makefile中指定。
指定自定義頭文件路徑方式為:
-IPATH1 -IPATH2...
如當前目錄下的inc文件夾,指定為頭文件, 那麼在編譯a.c時,可以命令寫作:
gcc a.c -I./inc -o a.out
❷ 如何在Linux上安裝內核頭文件
當在編譯一個設備驅動模塊時,需要在系統中安裝內核頭文件。內核頭文件同樣在編譯與內核直接鏈接的用戶空間程序時需要。當在這些情況下安裝內核頭文件時,必須確保內核頭文件精確地與當前內核版本匹配(比如:3.13.0-24-generic)。
如果內核是發行版自帶的內核版本,或者使用默認的包管理器的基礎倉庫升級的(比如:apt-ger、aptitude或者yum),也可以使用包管理器來安裝內核頭文件。
另一方面,如果下載的是kernel源碼並且手動編譯的,可以使用make命令來安裝匹配的內核頭文件。
使用apt-get命令來安裝匹配的內核頭文件:
1、首先,使用dpkg-query命令檢查是否有可用的內核頭文件。
$ dpkg-query -s linux-headers-$(uname -r)
dpkg-query: package 'linux-headers-3.11.0-26-generic' is not installed and no information is available
2、接著使用下面的命令安裝匹配的內核頭文件。
$ sudo apt-get install linux-headers-$(uname -r)
3、驗證頭文件是否成功安裝。
$ dpkg-query -s linux-headers-$(uname -r)
Package: linux-headers-3.11.0-26-genericStatus: install ok installed
4、Debian、Ubuntu、Linux Mint默認頭文件在/usr/src下。
使用yum命令來安裝匹配的內核頭文件:
1、首先,用下面的命令檢查系統是否已經安裝了頭文件。如果下面的命令沒有任何輸出,這就意味著還沒有頭文件。
$ rpm -qa | grep kernel-headers-$(uname -r)
2、接著用yum命令安裝頭文件。這個命令會自動找出合適的頭文件並安裝。
$ sudo yum install kernel-headers
3、驗證包安裝的狀態。
$ rpm -qa | grep kernel-headers-$(uname -r)
kernel-headers-3.10.0-123.9.3.el7.x86_64
4、Fedora、CentOS 或者 RHEL上默認內核頭文件的位置是/usr/include/linux。
❸ 怎麼在Linux下文件頭部添加內容
文件頭部添加一行字元:
用sed的i命令在第一行前面插入即可,加上 -i 選項直接操作文件。
sed -i '1iInsert this line' file.txt
文件尾部添加一行字元
echo "Append this line" >> file.txt
或者復雜一點的,用awk,
awk '{print}END{print("Append this line")}' file.txt >output.txt
❹ linux用gcc編譯
運行結果我不給了,自己看:
直接編譯:
gcc main.c compute.c input.c -o power
運行程序
./power
makefile 最簡單,直觀的的編寫方法:
power:main.o compute.o input.o
cc main.o compute.o input.o -o power
main.o:main.c main.h compute.h input.h
cc -c main.c
compute.o:compute.c compute.h
cc -c compute.c
input.o:input.c input.h
cc -c input.c
.PHONY : clean
clean :
rm -f *.o power
保存後成makefile或Makefile推薦使用後者:
make
想重新編譯前運行:
make clean
make
運行程序:
./power
特別說明:cc,rm命令行前有一個tab符,別搞錯了。cc 在linux上是指向gcc的軟符號鏈接,為了兼容其他系統,我們寫的cc。
makefile有更簡寫但不簡單的寫法,不給出來。你提問這個說明你不會編寫makefile,給出的是最基本用法。有興趣自己看,一天能學完。
❺ 如何在Linux上安裝內核頭文件
什麼系統?CentOS、Fedora、RHEL等直接用yum
install
kernel-headers。
Ubuntu嘗試用apt-get
install。
不過,建議安裝前,先查看一下當前使用的內核版本。
linux下可能會有2個內核共存。例如2.6.18和2.6.33共存。每次啟動時,都會選定一個內核版本。那麼。安裝kernel-headers時,選擇的版本應當與當前使用的內核版本一致。
就是2.6.18的內核配2.6.18的kenrl-headers。
因為以前曾經有人遇到過不匹配的狀況,導致某些程序功能無法安裝使用。
例如2.6.33的kernel已經發布安裝但2.6.33的kernel-headers還沒有發布。
結果以2.6.33內核登錄系統後,安裝kernel-headers時就出錯了。
可以使用uname
-r來查看當前內核版本。
使用yum
list
|
grep
kernel-headers來查看當前yum倉庫中的kernel-headers的版本是否和內核版本一致。
如果一致,直接yum
install
kernel-headers
如果不同,重啟系統,換其他內核版本登錄後,再yum
install。
Ubuntu參考執行
❻ linux下編寫c++,include的那些頭文件在什麼地方
C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。
1、#include <stdio.h>,直接到系統指定目錄去查找頭文件。
系統默認路徑為:/usr/include,/usr/local/include,/usr/lib/gcc-lib/i386-Linux/2.95.2/include(gcc庫文件的路徑,各個系統不一致)
2、#include "stidio.h",會先到當前目錄查找頭文件,如果沒找到在到系統指定目錄查找。
3、gcc編譯時查找頭文件,按照以下路徑順序查找:
gcc編譯時,可以設置-I選項以指定頭文件的搜索路徑,如果指定多個路徑,則按照順序依次查找。比如,gcc -I /usr/local/include/node a.c
gcc會查找環境變數C_INCLUDE_PATH,CPLUS_INCLUDE_PATH中指定的路徑。
(6)linux創建頭文件擴展閱讀:
應用程序代碼編譯過程:
編譯器根據頭文件提供的庫函數介面形式,來編譯代碼,然後生成目標文件;然後,再使用鏈接器將這個目標文件與系統庫鏈接;最終生成應用程序。代碼包含了自己寫的內容,還有系統提供好的現成的庫函數,整個結合起來才形成一個完整的程序。
庫函數的頭文件,在編譯的時候被使用,而庫函數的代碼段(庫文件),在鏈接的時候被使用。
example:
應用程序代碼在使用一個系統調用的時候,例如printf()函數,需要指定包含的頭文件stdio.h;另外,在鏈接的時候對應的鏈接libc.a(筆者電腦文件所在目錄:/usr/lib/i386-linux-gnu/libc.a)。
總結一下,編寫應用程序,需要使用linux系統提供的庫函數。具體實現起來,需要頭文件和庫文件。頭文件是需要我們編寫應用程序的時候,在源文件開頭添加的;而庫文件則需要配置編譯環境進行指定搜索目錄。
❼ 關於在linux下用gcc編譯頭文件的問題。
我用一個例子來告訴你怎麼樣在 C++ 里使用C的頭文件/函數。
比方說我有一個C的頭文件叫 c.h, C的源碼文件叫 c.c,內容分別是
c.h:
#ifndef _ASDFD_INCLUDED_
#define _ASDFD_INCLUDED_
#include <stdio.h>
extern int test(int a);
#endif
c.c:
#include "c.h"
int test(int a)
{
printf("A = %d\n", a);
return a*a;
}
現在我想在c++中使用c.c中提供的函數test(),我的c++文件名字叫 a.cpp,那麼裡面跟C有關的部分就要用 extern "C" {} 大括弧括起來,看看我的
a.cpp:
#include <iostream>
using namespace std;
extern "C"
{
#include "c.h"
}
int main()
{
int b = 12;
b = test(b);
cout<<"b = "<<b<<endl;
return 0;
}
看到了吧,#include "c.h" 被 extern "C" {}括起來了。
然後是如何編譯,先把C文件編出目標文件(.o)來
gcc -c c.c
你會看到生成了 c.o,其實,有目標文件就夠了,如果你一定要做成(靜態/動態)庫文件,也是可以的,不過我這里就不深入了,做成庫和直接用目標文件對解決你的問題沒有任何區別。
然後再編譯C++文件,也就是我的 a.cpp
g++ -o hello a.cpp c.o
看到了吧,我在編譯 a.cpp 的時候把C生成的 c.o也加上了。 然後生成 可執行的 hello, 運行
./hello
就可以看到
A = 12
b = 144
關於創建靜態庫,假定你有3個C文件, a.c, b.c, c.c 提供了你C++要用到的介面,那麼可以把這三個C文件編譯出來的目標文件放到一個庫文件里供C++使用,方法為
先編譯出目標文件
gcc -c a.c b.c c.c
這時候你應該看到有 a.o b.o c.o了
然後創建庫文件
ar cr libtest.a a.o b.o c.o
這三個目標文件就放入 libtest.a 這個靜態庫中了,然後編譯C++程序 (你的C++程序應該已經按照我前面說的用 extern "C" 把C的介面都括起來了),假定你的 libtest.a 放在 /home/aaa/lib下
g++ -o my.exe my.cpp -L/home/aaa/lib -ltest
就會生成可執行文件 my.exe了。
❽ linux c用什麼函數創建文件夾
Linux c語言可以使用系統提供的mkdir函數來創建文件夾。
1、函數原型
int mkdir(const char *path, mode_t mode);
2、參數說明:回
path是目錄名
mode是目錄許可權
3、需要答頭文件
#include<sys/stat.h>
4、示例
js">//添加mkdir函數聲明頭文件
#include<sys/stat.h>
#include<sys/types.h>
intmain()//主函數
{
//直接調用mkdir函數
//建立一個名為的文件夾
//許可權為0777,即擁有者許可權為讀、寫、執行
//擁有者所在組的許可權為讀、寫、執行
//其它用戶的許可權為讀、寫、執行
mkdir("",0777);
return0;
}
說明:函數調用試圖建立777許可權的文件夾,但是在實際程序執行時,還需要考慮umask值,最終才會得到實際的許可權。
5、執行效果如下圖所示
說明:t.c是源碼文件,有gcc進行編譯,-o是gcc的參數,有於指明編譯後輸出的文件,t為源碼經gcc編譯後生成的可執行文件。./t是執行當前目錄下的生成的可執行文件t。
❾ linux下編寫c++,include的那些頭文件在什麼地方
C/C++程序在linux下被編譯和連接時,GCC/G++會查找系統默認的include和link的路徑,以及自己在編譯命令中指定的路徑。自己指定的路徑就不說了,這里說明一下系統自動搜索的路徑。
【1】include頭文件路徑
除了默認的/usr/include,
/usr/local/include等include路徑外,還可以通過設置環境變數來添加系統include的路徑:
#
C
export
C_INCLUDE_PATH=XXXX:$C_INCLUDE_PATH
#
CPP
export
CPLUS_INCLUDE_PATH=XXX:$CPLUS_INCLUDE_PATH
以上修改可以直接命令行輸入(一次性),可以在/etc/profile中完成(對所有用戶生效),也可以在用戶home目錄下的.bashrc或.bash_profile中添加(針對某個用戶生效),修改完後重新登錄即生效。
【2】link鏈接庫文件路徑
鏈接庫文件在連接(靜態庫和共享庫)和運行(僅限於使用共享庫的程序)時被使用,其搜索路徑是在系統中進行設置的(也可以在編譯命令中通過
-l
-L
來指定,這里講的是使用系統默認搜索路徑)。
一般
Linux
系統把
/lib
/usr/lib
/usr/local/lib
作為默認的庫搜索路徑,所以使用這幾個目錄中的鏈接庫文件可直接被搜索到(不需要專門指定鏈接庫路徑)。對於默認搜索路徑之外的庫,則需要將其所在路徑添加到gcc/g++的搜索路徑之中。
鏈接庫文件的搜索路徑指定有兩種方式:1)修改/etc/so.ld.conf
2)修改環境變數,在其中添加自己的路徑
1)在環境變數中添加
動態鏈接庫搜索路徑:
export
LD_LIBRARY_PATH=XXX:$LD_LIBRARY_PATH
靜態鏈接庫搜索路徑:
export
LIBRARY_PATH=XXX:$LIBRARY_PATH
以上修改可以直接命令行輸入(一次性),可以在/etc/profile中完成(對所有用戶生效),也可以在用戶home目錄下的.bashrc或.bash_profile中添加(針對某個用戶生效),修改完後重新登錄即生效。
2)在/etc/ld.so.conf
中添加指定的鏈接庫搜索路徑(需要root許可權),然後運行
/sbin/ldconfig,以達到刷新
/etc/ld.so.cache的效果。
以上兩種方式均可以達到指定鏈接庫搜索路徑的效果。