使用GCC中的多个头文件进行编译 - 未定义引用...数学

时间:2013-03-15 12:56:48

标签: c gcc compilation

我一直在研究这个问题。我有这些文件:

main.c
zSim.h 
zSim.c
zDynamicArray.h 
zDynamicArray.c
zOptions.h 
zOptions.c
zMain.h 
zMain.c

所有文件和标题都位于同一文件夹中。

我的主要包括以下内容:

#include "zDynamicArray.h"
#include "zOptions.h"
#include "zMain.h"
#include "zSim.h"
#include <stdio.h>
#include <math.h>

我正在使用标头警卫。例如,这来自我的zSim.h文件:

#ifndef SIM_H
#define SIM_H
#include "zDynamicArray.h"
#include "zOptions.h"

//This Header is accountable
//for all Simulation Related things. 

int Simulate(SIMOPT so,PRINTOPT po);

#endif

这是我的zSim.c代码的片段(也许我在这里做错了什么?):

#define M_PI 3.14159265358979323846
#include "zSim.h"
#include "zDynamicArray.h"
#include "zOptions.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

我正在使用这个gcc命令进行编译:

gcc main.c zSim.c zOptions.c zDynamicArray.c zMain.c -o TEST

我也用过:

cc -c main.c
cc -c zSim.c
cc -c ... etc
cc *.o -o TEST

它们都会导致math.h库中任何内容的未定义引用。此外,当我使用gcc -I命令时,数学仍未定义。

如果我使用gcc main.c编译,我的头文件中的任何内容都会得到未解析的引用。

我该怎么办?

2 个答案:

答案 0 :(得分:4)

在最后尝试-lmgcc -c main.c cc -c zSim.c cc -c ... etc cc *.o -o TEST -lm

您必须使用-lm选项链接数学库。这里解释了原因:Why do you have to link the math library in C?

答案 1 :(得分:2)

  

它们都会导致math.h库中任何内容的未定义引用

math.h只是包含原型和类型声明的头文件。创建可执行文件时,还需要链接对数学库。将-lm添加到您的gcc通话中:

gcc main.c zSim.c zOptions.c zDynamicArray.c zMain.c -o TEST -lm

另见Undefined reference to `sin`