我一直在研究这个问题。我有这些文件:
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
编译,我的头文件中的任何内容都会得到未解析的引用。
我该怎么办?
答案 0 :(得分:4)
在最后尝试-lm
:gcc -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