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
...그러면 양쪽의 기능을 서로 링크하는 것을 알 수 있습니다.그러나 지금 쓰여 있는 코드에서는 반대의 문제에 직면하게 됩니다.다양한 정의:main
1개(확실히 포인트)를 삭제해야 합니다.
큰 프로그램에서는 일반적으로 변경되지 않은 컴파일을 다시 컴파일하지 않기 위해 컴파일과 링크를 개별적으로 수행합니다.보통 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++)..c
C++ 코을을을)을 c c c c c c c 。
.h
C 함수의 파일은 다음과 같은 종류의 가드에 싸여 있지 않습니다.
#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에 대한 .create
point.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
'programing' 카테고리의 다른 글
JavaScript에서 어제 날짜 계산 (0) | 2023.01.05 |
---|---|
새로운 self();는 PHP에서 무엇을 의미합니까? (0) | 2023.01.05 |
같은 컨트롤러에서 다른 기능을 호출하고 있습니까? (0) | 2023.01.05 |
Django에서 매일 데이터베이스에 새 테이블을 만드는 방법 (0) | 2023.01.05 |
PHP 배열 삭제 값(키 아님) (0) | 2022.12.31 |