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