Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux环境中,从另一个用C编写的文件调用用C编写的外部函数_C - Fatal编程技术网

在Linux环境中,从另一个用C编写的文件调用用C编写的外部函数

在Linux环境中,从另一个用C编写的文件调用用C编写的外部函数,c,C,在linux中调用我在Pico编辑器中编写的外部函数时遇到问题。程序应该调用一个外部函数,它们都是用C编写的 #include???? void calcTax() float calcfed() float calcssi() //存根程序 #include"FILE2"???or do I use"./FILE2"// not sure which to use here or what extension the file should have. .c or

在linux中调用我在Pico编辑器中编写的外部函数时遇到问题。程序应该调用一个外部函数,它们都是用C编写的

#include????

void calcTax()
float calcfed()
float calcssi()

//存根程序

#include"FILE2"???or do I use"./FILE2"// not sure which to use here or what        extension     the file should have. .c or .h and if it is .h do I simply change the file     name to file.h?
#include<stdio.h>
#define ADDR(var) &var

extern void calctaxes()
int main()
{
}
#包括“FILE2”?或者我是否使用“/FILE2”//不确定在此处使用哪个文件或该文件应具有什么扩展名。c或.h,如果是.h,我是否只需将文件名更改为file.h?
#包括
#定义ADDR(var)&var
外部无效calctaxes()
int main()
{
}
我正在使用gcc进行编译,但它不会编译。这两个文件位于同一目录中,扩展名为.c


我是一名新生,所以请容忍我。

通常,您不希望包含
.c
实现文件。通常需要将两个源文件构建到对象中:

cc -o file1.o file1.c
cc -o file2.o file2.c
然后在末尾将它们链接到一个可执行文件中:

cc -o example file1.o file2.o
要允许在两个
.c
文件之间调用函数,您需要创建一个头文件(
.h
),该文件包含对共享感兴趣的所有内容的函数声明。对于您来说,这可能类似于
header.h
,包含:

void calcTax(void);
float calcfed(void);
float calcssi(void);

然后,只需从需要了解这些函数的实现文件中包含“header.h”。

通常您不希望包含
.c
实现文件。通常需要将两个源文件构建到对象中:

cc -o file1.o file1.c
cc -o file2.o file2.c
然后在末尾将它们链接到一个可执行文件中:

cc -o example file1.o file2.o
要允许在两个
.c
文件之间调用函数,您需要创建一个头文件(
.h
),该文件包含对共享感兴趣的所有内容的函数声明。对于您来说,这可能类似于
header.h
,包含:

void calcTax(void);
float calcfed(void);
float calcssi(void);

然后,只需从需要了解这些函数的实现文件中包含“header.h”。

通常,当您希望一个编译单元中的函数调用另一个编译单元中的函数时,应该创建包含函数原型的头文件。头文件可以包含在两个编译单元中,以确保双方都同意接口

calctax.h

#ifndef calctax_h_included
#define calctax_h_included

void calctaxes(void);
/* any other related prototypes we want to include in this header */

#endif
请注意,函数上不需要
extern
,只需要全局数据。此外,由于函数不接受参数,因此应该将
void
放在参数列表中,并且在原型的末尾还需要一个分号

接下来,我们可以将此头文件包含在实现该函数的.c文件中:

calctax.c

#include "calctax.h"

void calctaxes(void)
{
    /* implementation */
}
最后,我们在调用函数的主.c文件中包含相同的头文件:

main.c

#include "calctax.h"

int main(int argc, char **argc)
{
    calctax();
    return 0;
}
您可以使用编译并将它们链接在一起

% gcc -o main main.c calctax.c

通常,当您希望一个编译单元中的函数调用另一个编译单元中的函数时,应该创建包含函数原型的头文件。头文件可以包含在两个编译单元中,以确保双方都同意接口

calctax.h

#ifndef calctax_h_included
#define calctax_h_included

void calctaxes(void);
/* any other related prototypes we want to include in this header */

#endif
请注意,函数上不需要
extern
,只需要全局数据。此外,由于函数不接受参数,因此应该将
void
放在参数列表中,并且在原型的末尾还需要一个分号

接下来,我们可以将此头文件包含在实现该函数的.c文件中:

calctax.c

#include "calctax.h"

void calctaxes(void)
{
    /* implementation */
}
最后,我们在调用函数的主.c文件中包含相同的头文件:

main.c

#include "calctax.h"

int main(int argc, char **argc)
{
    calctax();
    return 0;
}
您可以使用编译并将它们链接在一起

% gcc -o main main.c calctax.c

那个
ADDR
宏看起来非常令人发指——小心那个。听起来你应该后退一步,阅读编译器和链接器的功能。一旦你理解了翻译单元和可执行代码之间的关系,答案就显而易见了;使用什么编辑器创建源文件并不重要。我还删除了C++标签;C和C++是两种不同的语言,你使用C, > ADDR 宏看起来非常令人发指——注意这个。听起来你应该退一步,而不是读编译器和链接器。一旦你理解了翻译单元和可执行代码之间的关系,答案就显而易见了;使用什么编辑器创建源文件并不重要。我还删除了C++标签;C和C++是两种不同的语言,你使用C.所以我已经有了FLIE1.C和FIL2.C,你是说我应该把它们改成文件1.O和FIL2.2,然后使用GCC -O文件1编译.O文件2. O?不。将
.c
文件编译成
.o
对象,然后将
.o
对象链接到最终的可执行文件中。哦,我想我明白了。。。c是我的函数文件。我应该把它改成.h扩展名?如果有定义的话,可能不会。通常,标题应该只包含声明。好的,我感谢您的帮助,但我仍然感到困惑。不是你的错,我只是没有正确地解释这个问题。file1.c(存根程序),file2.c(函数)。我还遵循你原来的建议吗?请原谅我的无知。我已经有了file1.c和file2.c,你是说我应该将它们改为file1.o和file2.o,然后使用gcc-o file1.o file2.o进行编译吗?不。按照我描述的步骤进行。将
.c
文件编译成
.o
对象,然后将
.o
对象链接到最终的可执行文件中。哦,我想我明白了。。。c是我的函数文件。我应该把它改成.h扩展名?如果有定义的话,可能不会。通常,标题应该只包含声明。好的,我感谢您的帮助,但我仍然感到困惑。不是你的错,我只是没有正确地解释这个问题。file1.c(存根程序),file2.c(函数)。我还遵循你原来的建议吗?原谅我的无知