gpt4 book ai didi

c - 使用 GCC 在 C 中未定义对 SIGN 的引用

转载 作者:行者123 更新时间:2023-11-30 20:55:14 25 4
gpt4 key购买 nike

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

#include <math.h>
int main(void) {
int j = SQR(4);
int i = (int)(sqrt(16.0));
}

现在,我使用 - 进行编译

gcc -c -o ../../obj/test1.o test1.c -I../../include

它会生成 .o 文件。

现在,我尝试使用 - 创建可执行文件 -

gcc -o ../../bin/test1../../obj/test1.o -I../../include -lm

但这给了我下面的错误(之前的大多数问题都是通过 -lm 开关解决的,但我有这个) -

../../obj/test1.o:test1.c:(.text+0x13): undefined reference to `SQR'
../../obj/test1.o:test1.c:(.text+0x13): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `SQR'

奇怪的是,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)/*~

我在 Windows 中使用 Cygwin。

最佳答案

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));
}

您还可以使用函数

int SQR(int x)
{
return x*x;
}

使用函数的优点是它不会对参数求值两次。缺点是您无法使用它来计算 floatdouble 的平方。

关于c - 使用 GCC 在 C 中未定义对 SIGN 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34563750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com