C에서 오브젝트 파일을 링크하려면 어떻게 해야 하나요?"아키텍처 x86_64에 대한 정의되지 않은 기호"에서 실패함
그래서 내 파일(file2.c)의 다른 C(file1.c) 파일에 정의되어 있는 함수를 사용하려고 합니다.그러기 위해 file1(file1.h)의 헤더를 포함합니다.
그러나 gcc를 사용하여 파일을 컴파일하려고 할 때마다 다음 오류가 계속 발생합니다.
Undefined symbols for architecture x86_64:
"_init_filenames", referenced from:
_run_worker in cc8hoqCM.o
"_read_list", referenced from:
_run_worker in cc8hoqCM.o
ld: symbol(s) not found for architecture x86_64
file2의 file1의 함수를 사용하려면 오브젝트 파일을 링크해야 한다고 들었습니다만, 그것이 무엇을 의미하는지 모르겠습니다.
사용하시는 것 같습니다.gcc
오브젝트 파일을 링크하려면 다음 작업을 수행합니다.
$ gcc -o output file1.o file2.o
오브젝트 파일을 취득하려면 , 다음의 방법으로 컴파일 합니다.
$ gcc -c file1.c
file1.o 등이 출력됩니다.
파일을 실행 파일에 링크하려면 다음 작업을 수행합니다.
$ gcc -o output file1.c file2.c
기존 답변은 이미 '어떻게'에 대해 다루고 있지만, 궁금해하는 다른 분들을 위해 '무엇'과 '왜'에 대해 자세히 설명하려고 합니다.
컴파일러(gcc)의 기능:"컴파일"이라는 용어는 상위 수준에서 "소스 코드를 프로그램으로 변환"하는 의미로 사용되기 때문에 다소 오버로드된 용어이지만, 더 기술적으로 "소스 코드를 개체 코드로 변환"하는 것을 의미합니다.gcc와 같은 컴파일러는 소스 코드를 프로그램으로 변환하기 위해 컴파일(소스 코드를 오브젝트 코드로 변환하는 후자의 정의에서와 같이)과 링크(필요한 오브젝트 코드 파일을 하나의 완전한 실행 파일로 결합하는 프로세스)의 두 가지 관련 기능을 수행합니다.
발생한 최초의 에러는 엄밀히 말하면 「링크 에러」이며, 링커인 「ld」에 의해 느려집니다.(엄격한) 컴파일 시간 오류와 달리 링커는 이미 객체 공간에 있기 때문에 소스 코드 행에 대한 참조는 없습니다.
기본적으로는 gcc가 입력으로 소스 코드를 지정받으면 각각 컴파일을 시도하여 모두 링크합니다.다른 응답에서 알 수 있듯이 플래그를 사용하여 gcc를 먼저 컴파일하고 나중에 오브젝트 파일을 사용하여 다른 순서로 링크할 수 있습니다.이 2단계 프로세스는 불필요해 보일 수 있지만(아마도 매우 작은 프로그램일 수 있습니다), 작은 변경을 할 때마다 프로젝트 전체를 컴파일 할 경우 상당한 시간을 낭비하게 되는 매우 큰 규모의 프로그램을 관리할 때는 매우 중요합니다.
다음 명령어로 컴파일 및 링크할 수 있습니다.
gcc file1.c file2.c -o myprogram
다음 항목과 함께 실행:
./myprogram
그러나 질문에 답하려면 오브젝트 파일을 다음 주소로 전달하기만 하면 됩니다.gcc
:
gcc file1.o file2.o -o myprogram
foo1.c, foo2.c, foo3.c 및 makefile을 bash 형식으로 만든 폴더에 추가합니다.
makefile을 사용하지 않을 경우 명령어를 실행할 수 있습니다.
gcc -c foo1.c foo2.c foo3.c
그리고나서
gcc -o output foo1.o foo2.o foo3.o
foo1.c
#include <stdio.h>
#include <string.h>
void funk1();
void funk1() {
printf ("\nfunk1\n");
}
int main(void) {
char *arg2;
size_t nbytes = 100;
while ( 1 ) {
printf ("\nargv2 = %s\n" , arg2);
printf ("\n:> ");
getline (&arg2 , &nbytes , stdin);
if( strcmp (arg2 , "1\n") == 0 ) {
funk1 ();
} else if( strcmp (arg2 , "2\n") == 0 ) {
funk2 ();
} else if( strcmp (arg2 , "3\n") == 0 ) {
funk3 ();
} else if( strcmp (arg2 , "4\n") == 0 ) {
funk4 ();
} else {
funk5 ();
}
}
}
foo2.c
#include <stdio.h>
void funk2(){
printf("\nfunk2\n");
}
void funk3(){
printf("\nfunk3\n");
}
foo3.c
#include <stdio.h>
void funk4(){
printf("\nfunk4\n");
}
void funk5(){
printf("\nfunk5\n");
}
메이크 파일
outputTest: foo1.o foo2.o foo3.o
gcc -o output foo1.o foo2.o foo3.o
make removeO
outputTest.o: foo1.c foo2.c foo3.c
gcc -c foo1.c foo2.c foo3.c
clean:
rm -f *.o output
removeO:
rm -f *.o
.c파일을 .o파일과 함께 컴파일하는 방법에 대한 언급이 없기 때문에 이 코멘트는 다음과 같이 요구됩니다.
이 답변의 main.c는 어디에 있나요?:/ file1.c가 메인인 경우 이미 컴파일된 다른 .o 파일과 링크하려면 어떻게 해야 합니까?– Tom Brito 2014년 10월 12일 19:45
$ gcc main.c lib_obj1.o lib_obj2.o lib_objN.o -o x0rbin
여기서 main.c는 main() 함수를 가진 C 파일이며 오브젝트 파일(*.o)은 미리 컴파일되어 있습니다.GCC는 이것들을 함께 처리하는 방법을 알고 있으며, 그에 따라 링커를 호출하여 최종 실행 파일(이 예에서는 x0rbin)을 생성합니다.
main.c에 정의되지 않은 함수를 사용할 수 있지만 오브젝트 파일(*.o)에 정의되어 있는 함수에 대한 외부 참조를 사용할 수 있습니다.
오브젝트 파일의 형식이 올바른 경우(COFF 등) .obj 또는 기타 확장자와 링크할 수도 있습니다.
언급URL : https://stackoverflow.com/questions/15441877/how-do-i-link-object-files-in-c-fails-with-undefined-symbols-for-architecture
'IT이야기' 카테고리의 다른 글
대부분의 C개발자가 const 대신 정의를 사용하는 이유는 무엇입니까? (0) | 2022.06.02 |
---|---|
Laravel에서 Vue.js를 운영 모드로 전환하는 방법 (0) | 2022.06.02 |
사물의 깊은 복사는 어떻게 합니까? (0) | 2022.06.02 |
Java JIT는 JDK 코드를 실행할 때 부정행위를 합니까? (0) | 2022.06.02 |
'구조나 조합이 아닌 조합원 요청'은 무슨 뜻입니까? (0) | 2022.06.02 |