Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
使用GCC登录C的未定义引用_C_Makefile - Fatal编程技术网

使用GCC登录C的未定义引用

使用GCC登录C的未定义引用,c,makefile,C,Makefile,关于math.h中的函数在编译过程中在C代码中找不到的问题,这里已经提出了很多,我也面临着类似的问题。经历了所有这些,似乎没有一个适用于我的问题。我在一个名为test1.C的文件中有一些C代码- #include <math.h> int main(void) { int j = SQR(4); int i = (int)(sqrt(16.0)); } 然后生成.o文件 现在,我尝试使用- gcc -o ../../bin/test1../../obj/test1.o -I

关于math.h中的函数在编译过程中在C代码中找不到的问题,这里已经提出了很多,我也面临着类似的问题。经历了所有这些,似乎没有一个适用于我的问题。我在一个名为test1.C的文件中有一些C代码-

#include <math.h>
int main(void) {
  int j = SQR(4);
  int i = (int)(sqrt(16.0));
}
然后生成.o文件

现在,我尝试使用-

gcc -o ../../bin/test1../../obj/test1.o -I../../include -lm
但这给了我下面的错误(以前的大多数问题都是通过-lm开关解决的,但我有这个错误)——

奇怪的是,sqrt可以工作,但许多其他功能(如SQR、SIGN等)会导致问题(这种情况无关紧要)。请注意,这些命令是由make文件生成的-

IDIR =../../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=../../obj
LDIR =../../lib

LIBS=-lm

_DEPS = nrutil.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = test1.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
  $(CC) -c -o $@ $< $(CFLAGS)

../../bin/svdcmp: $(OBJ)
  gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
   rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
IDIR=../../include
CC=gcc
CFLAGS=-I$(IDIR)
ODIR=../../obj
LDIR=../../lib
LIBS=-lm
_DEPS=nrutil.h
部门=$(patsubst%,$(IDIR)/%,$(部门))
_OBJ=test1.o
OBJ=$(patsubst%,$(ODIR)/%,$(_OBJ))
$(ODIR)/%.o:%.c$(DEPS)
$(CC)-c-o$@$<$(CFLAGS)
../../bin/svdcmp:$(OBJ)
gcc-o$@$^$(CFLAGS)$(LIBS)
.假冒:干净
清洁:
rm-f$(ODIR)/*.o*~核心$(INCDIR)/*~

我正在将Cygwin与Windows一起使用。

SQR
不是标准函数,也没有在
math.h
中声明或在标准库中定义

添加您自己的实现

#include <math.h>

// Use a macro to define SQR
#define SQR(x) ((x)*(x))

int main(void) {
  int j = SQR(4);
  int i = (int)(sqrt(16.0));
}

使用函数的优点是它不会对参数求值两次。缺点是,您不能使用它来计算
float
double
的平方。

标准C数学库中没有
SQR
函数。事实上,您找到了正确的名称,
sqrt
。您是否认为相同的函数以多个名称导出?或者两者之间有细微的区别?也没有
符号
功能。您不应该试图猜测库函数名,而应该查阅文档,只使用文档化的函数名。@Tom-这些函数包含在svdcmp.c代码中,这些函数来自c-。仅包括math.h和nrutil.h。例如,我在nrutil.h中没有找到符号,所以我假设它一定是在math.h.My bad中找到的-我看到这些都是在我提供的链接中定义的。然而,在本书中,这些并没有用代码来定义。是的,通常在C中,当一个大写的名称被用于某个看起来像函数的东西时,它可能是一个宏。在标题中询问关于
符号的问题,然后在示例中使用
SQR
,可能会有点混淆。请注意,所有标准库函数(以及类似宏的函数)都是小写的。对于
符号
,您可能是有意的<代码> SQR是很容易实现的,或者您可以将其视为特殊情况。函数的问题是什么?另外,该宏计算
x
两次。@Olaf,这是使用宏的缺点。好处是它是多态的。如果你需要多态性,你应该使用OOP语言。在任何情况下,我都喜欢可预测的行为。如果将这些“助手”封装在头文件中,这一点就变得至关重要。不确定为什么需要平方函数/宏。操作非常清楚(我认为这就是标准库中没有的原因)。@Olaf,虽然可能不需要,但我经常使用它。抽象——sqaure——是有价值的。它可以使用简单的乘法来实现这一事实是一个细节。
IDIR =../../include
CC=gcc
CFLAGS=-I$(IDIR)

ODIR=../../obj
LDIR =../../lib

LIBS=-lm

_DEPS = nrutil.h
DEPS = $(patsubst %,$(IDIR)/%,$(_DEPS))

_OBJ = test1.o
OBJ = $(patsubst %,$(ODIR)/%,$(_OBJ))


$(ODIR)/%.o: %.c $(DEPS)
  $(CC) -c -o $@ $< $(CFLAGS)

../../bin/svdcmp: $(OBJ)
  gcc -o $@ $^ $(CFLAGS) $(LIBS)

.PHONY: clean

clean:
   rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~
#include <math.h>

// Use a macro to define SQR
#define SQR(x) ((x)*(x))

int main(void) {
  int j = SQR(4);
  int i = (int)(sqrt(16.0));
}
int SQR(int x)
{
   return x*x;
}