在Linux环境中,从另一个用C编写的文件调用用C编写的外部函数
在linux中调用我在Pico编辑器中编写的外部函数时遇到问题。程序应该调用一个外部函数,它们都是用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
#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,.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(函数)。我还遵循你原来的建议吗?原谅我的无知