在C里面要先聲明,再使用。
創(chuàng)新互聯(lián)公司于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都做網(wǎng)站、成都網(wǎng)站建設(shè)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元安仁做網(wǎng)站,已為上家服務(wù),為安仁各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:028-86922220
看你主調(diào)函數(shù)(caller)跟被調(diào)函數(shù)(callee)是不是在同一個(gè)文件中,以及兩者的位置。
如果A.h中沒(méi)有聲明這個(gè)函數(shù),那么include沒(méi)有用。
如果你是編譯成了一個(gè)目標(biāo)文件,你可以直接在caller定義前,加上callee的聲明?;蛘甙裞allee的定義放在caller前定義。
調(diào)用C++函數(shù)庫(kù),一般不能直接調(diào)用,需要將C++庫(kù)轉(zhuǎn)換成C接口輸出,方可以使用C調(diào)用
將 C++ 函數(shù)聲明為``extern "C"''(在你的 C++ 代碼里做這個(gè)聲明),然后調(diào)用它(在你的 C 或者 C++ 代碼里調(diào)用)。例如:
// C++ code:
extern "C" void f(int);
void f(int i)
{
// ...
}
然后,你可以這樣使用 f():
/* C code: */
void f(int);
void cc(int i)
{
f(i);
/* ... */
}
當(dāng)然,這招只適用于非成員函數(shù)。如果你想要在 C 里調(diào)用成員函數(shù)(包括虛函數(shù)),則需要提供一個(gè)簡(jiǎn)單的包裝(wrapper)。例如:
// C++ code:
class C
{
// ...
virtual double f(int);
};
extern "C" double call_C_f(C* p, int i) // wrapper function
{
return p-f(i);
}
然后,你就可以這樣調(diào)用 C::f():
/* C code: */
double call_C_f(struct C* p, int i);
void ccc(struct C* p, int i)
{
double d = call_C_f(p,i);
/* ... */
}
如果你想在 C 里調(diào)用重載函數(shù),則必須提供不同名字的包裝,這樣才能被 C 代碼調(diào)用。例如:
// C++ code:
void f(int);
void f(double);
extern "C" void f_i(int i) { f(i); }
extern "C" void f_d(double d) { f(d); }
然后,你可以這樣使用每個(gè)重載的 f():
/* C code: */
void f_i(int);
void f_d(double);
void cccc(int i,double d)
{
f_i(i);
f_d(d);
/* ... */
}
注意,這些技巧也適用于在 C 里調(diào)用 C++ 類庫(kù),即使你不能(或者不想)修改 C++ 頭文件。
再看下面的例子:
aa.cxx
#include "aa.h"
int sample::method()
{
cout"method is called!\n";
}
aa.h
#include
using namespace std;
class sample
{
public:
int method();
};
將上面的兩個(gè)文件生成動(dòng)態(tài)庫(kù)libaa.so放到 /usr/lib目錄下,編譯命令如下
sudo g++ -fpic -shared -g -o /usr/lib/libaa.so aa.cxx -I ./
由于在C中不能識(shí)別類,所以要將上面類的成員函數(shù)封裝成C接口函數(shù)輸出,下面進(jìn)行封裝,將輸出接口轉(zhuǎn)換成C接口。
mylib.cxx
#include "add.h"
#ifndef _cplusplus
#define _cplusplus
#include "mylib.h"
#endif
int myfunc()
{
sample ss;
ss.method();
return 0;
}
mylib.h
#ifdef _cplusplus
extern "C"
{
#endif
int myfunc();
#ifdef _cplusplus
}
#endif
在linux下,gcc編譯器并沒(méi)用變量_cplusplus來(lái)區(qū)分是C代碼還是C++代碼,如果使用gcc編譯器,這里我們可以自己定義一個(gè)變量_cplusplus用于區(qū)分C和C++代碼,所以在mylib.cxx中定義了一個(gè)變量_cplusplus用于識(shí)別是否需要“extern "C"”將函數(shù)接口封裝成C接口。但是如果使用g++編譯器則不需要專門定義_cplusplus,編譯命令如下:
g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./
main.c
#include
#include
#include "mylib.h"
int
main()
{
int (*dlfunc)();
void *handle; //定義一個(gè)句柄
handle = dlopen("./mylib.so", RTLD_LAZY);//獲得庫(kù)句柄
dlfunc = dlsym(handle, "myfunc"); //獲得函數(shù)入口
(*dlfunc)();
dlclose(handle);
return 0;
}
編譯命令如下:
gcc -o main main.c ./mylib.so -ldl
下面就可以執(zhí)行了。
需要說(shuō)明的是,由于main.c 和 mylib.cxx都需要包含mylib.h,并且要將函數(shù)myfunc封裝成C接口函數(shù)輸出需要“extern "C"”,而C又不識(shí)別“extern "C"”,所以需要定義_cplusplus來(lái)區(qū)別處理mylib.h中的函數(shù)myfunc。
在main.c的main函數(shù)中直接調(diào)用myfunc()函數(shù)也能執(zhí)行,這里介紹的是常規(guī)調(diào)用庫(kù)函數(shù)的方法。
c調(diào)用shell為system(cmd)
shell調(diào)用c執(zhí)行文件和調(diào)用普通的命令一樣,如 ls cd pwd等命令都是c寫的執(zhí)行文件
shell(控制臺(tái))不能直接調(diào)用什么函數(shù),只能執(zhí)行文件或命令
寫好的程序都是需要編譯鏈接成2進(jìn)制文件的
最簡(jiǎn)單的hello.c
#includestdio.h
int main(){
printf("hello world!");
return 0;
}
編輯好后輸入gcc -o hello hello.c進(jìn)行編譯
gcc是一般linux都有的編譯器
-o后面的參數(shù)就是生成的2進(jìn)制文件名,否則文件名是a.out
然后輸入./hello就可以運(yùn)行了
因?yàn)槎M(jìn)制文件是可以直接執(zhí)行的,需要在前面加上 ./ ,表示當(dāng)前目錄
不知道你具體的要求是怎樣的
首先,命令應(yīng)該是好和其他兩個(gè)區(qū)分開來(lái)的了,因?yàn)槊疃际强梢灾苯忧迷趕hell上面回車執(zhí)行的,而系統(tǒng)調(diào)用和庫(kù)函數(shù)都不行;
其次,Linux系統(tǒng)調(diào)用和C庫(kù)函數(shù)都是函數(shù)的形式,即都是“func(args)”的形式,但系統(tǒng)調(diào)用是
由系統(tǒng)內(nèi)核對(duì)外提供的服務(wù)接口;C庫(kù)函數(shù)和你自己寫的普通的函數(shù)沒(méi)有本質(zhì)的區(qū)別,只是在C標(biāo)準(zhǔn)庫(kù)中而已,Linux上面glibc就是C函數(shù)庫(kù)。從表面上看兩者不太好區(qū)分,不過(guò),你可以從它們需要包含的頭文件來(lái)區(qū)分,C庫(kù)函數(shù)像printf在
中,std就是標(biāo)準(zhǔn)(standard)的縮寫形式,因此在
中的函數(shù),基本都是C庫(kù)函數(shù);像
ssize_t
read(int
fd,
void
*buf,
size_t
count);這樣很多的系統(tǒng)調(diào)用是包含在
中的,unistd意思是UNIX
Standard,從這個(gè)意義就可以區(qū)分了。
希望對(duì)你有所幫助,如還有問(wèn)題,可隨時(shí)聯(lián)系我:-)
分享文章:linux命令調(diào)用c函數(shù) c語(yǔ)言調(diào)用linux命令
鏈接地址:http://www.rwnh.cn/article44/dododee.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、小程序開發(fā)、網(wǎng)站營(yíng)銷、電子商務(wù)、全網(wǎng)營(yíng)銷推廣、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容