成都网站建设设计

将想法与焦点和您一起共享

linux命令调用c函数 c语言调用linux命令

在linux下,我想调用A.c里面的某个函数,怎么写?

在C里面要先声明,再使用。

创新互联公司于2013年成立,是专业互联网技术服务公司,拥有项目成都做网站、成都网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元安仁做网站,已为上家服务,为安仁各地企业和个人服务,联系电话:028-86922220

看你主调函数(caller)跟被调函数(callee)是不是在同一个文件中,以及两者的位置。

如果A.h中没有声明这个函数,那么include没有用。

如果你是编译成了一个目标文件,你可以直接在caller定义前,加上callee的声明。或者把callee的定义放在caller前定义。

在Linux下,在C中怎么调用C++的库函数

调用C++函数库,一般不能直接调用,需要将C++库转换成C接口输出,方可以使用C调用

将 C++ 函数声明为``extern "C"''(在你的 C++ 代码里做这个声明),然后调用它(在你的 C 或者 C++ 代码里调用)。例如:

// C++ code:

extern "C" void f(int);

void f(int i)

{

// ...

}

然后,你可以这样使用 f():

/* C code: */

void f(int);

void cc(int i)

{

f(i);

/* ... */

}

当然,这招只适用于非成员函数。如果你想要在 C 里调用成员函数(包括虚函数),则需要提供一个简单的包装(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);

}

然后,你就可以这样调用 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 里调用重载函数,则必须提供不同名字的包装,这样才能被 C 代码调用。例如:

// 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 里调用 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();

};

将上面的两个文件生成动态库libaa.so放到 /usr/lib目录下,编译命令如下

sudo g++ -fpic -shared -g -o /usr/lib/libaa.so aa.cxx -I ./

由于在C中不能识别类,所以要将上面类的成员函数封装成C接口函数输出,下面进行封装,将输出接口转换成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来区分是C代码还是C++代码,如果使用gcc编译器,这里我们可以自己定义一个变量_cplusplus用于区分C和C++代码,所以在mylib.cxx中定义了一个变量_cplusplus用于识别是否需要“extern "C"”将函数接口封装成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"); //获得函数入口

(*dlfunc)();

dlclose(handle);

return 0;

}

编译命令如下:

gcc -o main main.c ./mylib.so -ldl

下面就可以执行了。

需要说明的是,由于main.c 和 mylib.cxx都需要包含mylib.h,并且要将函数myfunc封装成C接口函数输出需要“extern "C"”,而C又不识别“extern "C"”,所以需要定义_cplusplus来区别处理mylib.h中的函数myfunc。

在main.c的main函数中直接调用myfunc()函数也能执行,这里介绍的是常规调用库函数的方法。

在linux 用shell脚本调用C语言的执行文件,用到什么函数,求大神帮分析一下

c调用shell为system(cmd)

shell调用c执行文件和调用普通的命令一样,如 ls cd pwd等命令都是c写的执行文件

如何利用Linux控制台调用C/C++程序?

shell(控制台)不能直接调用什么函数,只能执行文件或命令

写好的程序都是需要编译链接成2进制文件的

最简单的hello.c

#includestdio.h

int main(){

printf("hello world!");

return 0;

}

编辑好后输入gcc -o hello hello.c进行编译

gcc是一般linux都有的编译器

-o后面的参数就是生成的2进制文件名,否则文件名是a.out

然后输入./hello就可以运行了

因为二进制文件是可以直接执行的,需要在前面加上 ./ ,表示当前目录

不知道你具体的要求是怎样的

linux系统调用 shell命令 c库函数怎么区分

首先,命令应该是好和其他两个区分开来的了,因为命令都是可以直接敲在shell上面回车执行的,而系统调用和库函数都不行;

其次,Linux系统调用和C库函数都是函数的形式,即都是“func(args)”的形式,但系统调用是

由系统内核对外提供的服务接口;C库函数和你自己写的普通的函数没有本质的区别,只是在C标准库中而已,Linux上面glibc就是C函数库。从表面上看两者不太好区分,不过,你可以从它们需要包含的头文件来区分,C库函数像printf在

中,std就是标准(standard)的缩写形式,因此在

中的函数,基本都是C库函数;像

ssize_t

read(int

fd,

void

*buf,

size_t

count);这样很多的系统调用是包含在

中的,unistd意思是UNIX

Standard,从这个意义就可以区分了。

希望对你有所帮助,如还有问题,可随时联系我:-)


网站标题:linux命令调用c函数 c语言调用linux命令
网页URL:http://chengdu.cdxwcx.cn/article/dododee.html