programing

C 오류: 함수에 대한 참조가 정의되지 않았지만 IS가 정의되었습니다.

randomtip 2023. 1. 5. 23:51
반응형

C 오류: 함수에 대한 참조가 정의되지 않았지만 IS가 정의되었습니다.

단순한 프로그램이지만 컴파일러 오류가 계속 발생합니다.컴파일러에 MinGW를 사용하고 있습니다.

여기 머리글 파일, 포인트.h:

//type for a Cartesian point
typedef struct {
  double x;
  double y;
} Point;

Point create(double x, double y);
Point midpoint(Point p, Point q);

요점은 다음과 같습니다.c:

//This is the implementation of the point type
#include "point.h"

int main() {
  return 0;
}
Point create(double x, double y) {
  Point p;
  p.x = x;
  p.y = y;
  return p;
}

Point midpoint(Point p, Point q) {
  Point mid;
  mid.x = (p.x + q.x) / 2;
  mid.y = (p.y + q.y) / 2;
  return mid;
}

여기서 컴파일러의 문제가 발생합니다.계속 듣고 있습니다.

testpoint.c: 'create(double x, double y)'에 대한 정의되지 않은 참조

단, point.c에 정의되어 있습니다.

이것은 testpoint.c라는 이름의 개별 파일입니다.

#include "point.h"
#include <assert.h>
#include <stdio.h>
int main() {
  double x = 1;
  double y = 1;
  Point p = create(x, y);

  assert(p.x == 1);
  return 0;
}

뭐가 문제인지 모르겠어요.

컴파일 및 링크는 어떻게 진행되고 있습니까?다음과 같은 두 파일을 모두 지정해야 합니다.

gcc testpoint.c point.c

...그러면 양쪽의 기능을 서로 링크하는 것을 알 수 있습니다.그러나 지금 쓰여 있는 코드에서는 반대의 문제에 직면하게 됩니다.다양한 정의:main1개(확실히 포인트)를 삭제해야 합니다.

큰 프로그램에서는 일반적으로 변경되지 않은 컴파일을 다시 컴파일하지 않기 위해 컴파일과 링크를 개별적으로 수행합니다.보통 makefile을 통해 수행해야 할 작업을 지정하고,make일을 할 수 있게 해 주세요.이 경우 다음과 같은 결과를 얻을 수 있습니다.

OBJS=testpoint.o point.o

testpoint.exe: $(OBJS)
    gcc $(OJBS)

첫 번째는 오브젝트 파일의 이름을 나타내는 매크로입니다.다음과 같이 확장 가능$(OBJS)두 번째 규칙은 1) 실행 파일이 오브젝트 파일에 의존한다는 것과 2) 실행 파일이 오브젝트 파일과 비교하여 오래된 경우 또는 오래된 경우 작성 방법을 알려주는 규칙입니다.

대부분의 make 버전(MinGW의 것을 포함)에는 C 소스 파일에서 오브젝트 파일을 작성하는 방법을 알려주는 "암묵적인 규칙"이 포함되어 있습니다.일반적으로 다음과 같습니다.

.c.o:
    $(CC) -c $(CFLAGS) $<

이것은, C 컴파일러의 이름이 CC라고 하는 매크로에 있는 것을 전제로 하고 있습니다(명시적으로 정의되어 있습니다).CC=gcc)를 지정하면, 매크로내의 임의의 플래그를 지정할 수 있습니다.CFLAGS(예:CFLAGS=-O3최적화를 유효하게 하다) 및$<는 소스 파일의 이름으로 확장되는 특수 매크로입니다.

일반적으로 이 파일은 다음 파일에 저장됩니다.Makefile프로그램을 작성하려면 , 를 입력하기만 하면 됩니다.make커맨드 라인에 표시됩니다.암묵적으로 다음 이름의 파일을 찾습니다.Makefile및 포함된 모든 규칙을 실행합니다.

이것의 좋은 점은 이다.make는 파일의 타임스탬프를 자동으로 조사하기 때문에 마지막으로 컴파일한 이후 변경된 파일(즉, ".c" 파일에 일치하는 ".o" 파일보다 더 최근 시간 제한이 있는 파일)만 다시 가져옵니다.

또한 1) 대규모 프로젝트에서는 make를 사용하는 방법에 차이가 많고 2) 다른 대안도 많다는 점에 유의하십시오.난 여기서 최소한의 고점만 맞췄어.

최근에 이런 일이 있었어요. 각 할 컴파일러 C C는 C++)..cC++ 코을을을)을 c c c c c c c 。

.hC 함수의 파일은 다음과 같은 종류의 가드에 싸여 있지 않습니다.

#ifdef __cplusplus
extern "C" {
#endif

// all of your legacy C code here

#ifdef __cplusplus
}
#endif

추가할 수도 있었지만 수정하고 싶지 않았기 때문에 C++ 파일에 다음과 같이 포함시켰습니다.

extern "C" {
#include "legacy_C_header.h"
}

(외부 "C"의 효과에 대한 명확한 설명에 대한 UncaAlby의 힌트)

'testpoint.c' 포인트.h를 포함하지만 point.c에 대해 알 수 없다는 것입니다.에는 point.c에 대한 .createpoint.c로 하겠습니다.

MinGW에 대해서는 잘 모르지만 컴파일러에게 point.c를 찾아보라고 말해야 합니다.예를 들어 gcc를 사용하면 다음과 같이 할 수 있습니다.

gcc point.c testpoint.c

다른 사람들이 지적한 바와 같이, 당신은 또한 그 중 하나를 제거할 필요가 있다.main을 사용법

point.h의 함수 정의에 extern 키워드를 추가합니다.

언급URL : https://stackoverflow.com/questions/5559250/c-error-undefined-reference-to-function-but-it-is-defined

반응형