内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

linux命令調(diào)用c函數(shù) c語(yǔ)言調(diào)用linux命令

在linux下,我想調(diào)用A.c里面的某個(gè)函數(shù),怎么寫?

在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前定義。

在Linux下,在C中怎么調(diào)用C++的庫(kù)函數(shù)

調(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ù)的方法。

在linux 用shell腳本調(diào)用C語(yǔ)言的執(zhí)行文件,用到什么函數(shù),求大神幫分析一下

c調(diào)用shell為system(cmd)

shell調(diào)用c執(zhí)行文件和調(diào)用普通的命令一樣,如 ls cd pwd等命令都是c寫的執(zhí)行文件

如何利用Linux控制臺(tái)調(diào)用C/C++程序?

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)前目錄

不知道你具體的要求是怎樣的

linux系統(tǒng)調(diào)用 shell命令 c庫(kù)函數(shù)怎么區(qū)分

首先,命令應(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)

成都網(wǎng)站建設(shè)公司
浙江省| 潼关县| 方正县| 涞源县| 东宁县| 连城县| 莆田市| 陇川县| 永登县| 响水县| 阿克苏市| 灵台县| 衡阳市| 蒲城县| 平泉县| 滦平县| 南涧| 会理县| 辽源市| 库尔勒市| 花莲市| 天气| 扎鲁特旗| 苍南县| 类乌齐县| 光泽县| 淮滨县| 海南省| 浏阳市| 井陉县| 托克逊县| 壤塘县| 顺义区| 泰安市| 富平县| 泸州市| 永兴县| 衡东县| 澄城县| 九江县| 班戈县|