GCC: Как я могу заставить эту компиляцию и компоновку работать? - PullRequest
3 голосов
/ 03 февраля 2011

Я хочу использовать из файла tester-1.c функции, которые я определил в libdrm.h и дал реализацию в libdrm.c. Три файла находятся в одной папке и используют функции pthread.

Их включаемые файлы:

libdrm.h

#ifndef __LIBDRM_H__
#define __LIBDRM_H__

#include <pthread.h>

#endif

libdrm.c <- не имеет main () </p>

#include <stdio.h>
#include <pthread.h>
#include "libdrm.h"

tester-1.c <- имеет main () </p>

#include <stdio.h>
#include <pthread.h>
#include "libdrm.h"

Ошибка компилятора для libdrm.c гласит:

gcc libdrm.c -o libdrm -l pthread
/usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../../../lib/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

И ошибки компилятора для tester-1.c говорят:

gcc tester-1.c -o tester1 -l pthread
/tmp/ccMD91zU.o: In function `thread_1':
tester-1.c:(.text+0x12): undefined reference to `drm_lock'
tester-1.c:(.text+0x2b): undefined reference to `drm_lock'
tester-1.c:(.text+0x35): undefined reference to `drm_unlock'
tester-1.c:(.text+0x3f): undefined reference to `drm_unlock'
/tmp/ccMD91zU.o: In function `thread_2':
tester-1.c:(.text+0x57): undefined reference to `drm_lock'
tester-1.c:(.text+0x70): undefined reference to `drm_lock'
tester-1.c:(.text+0x7a): undefined reference to `drm_unlock'
tester-1.c:(.text+0x84): undefined reference to `drm_unlock'
/tmp/ccMD91zU.o: In function `main':
tester-1.c:(.text+0x98): undefined reference to `drm_setmode'
tester-1.c:(.text+0xa2): undefined reference to `drm_init'
tester-1.c:(.text+0xac): undefined reference to `drm_init'
tester-1.c:(.text+0x10e): undefined reference to `drm_destroy'
tester-1.c:(.text+0x118): undefined reference to `drm_destroy'

Все эти функции определены в libdrm.c

Какие команды gcc я должен использовать для компиляции и компоновки этих файлов?

Ответы [ 3 ]

11 голосов
/ 03 февраля 2011

Чтобы скомпилировать ваши .c источники в объектные файлы , используйте опцию GCC -c. Затем вы можете связать объектные файлы с исполняемым файлом, используя необходимую библиотеку:

gcc libdrm.c -c
gcc tester-1.c -c
gcc tester-1.o libdrm.o -o tester1 -lpthread

Выполнение компиляции и связывание за один раз, как предлагали многие другие, тоже работает нормально. Однако хорошо понимать, что процесс сборки включает в себя оба эти этапа.

Ваша сборка не удалась, потому что ваши модули перевода (= исходные файлы) требовали символы друг от друга.

  • libdrm.c не может создать исполняемый файл, потому что у него нет функции main().
  • tester-1.c, поскольку компоновщик не был проинформирован о необходимых символах, определенных в libdrm.c.

С опцией -c GCC компилирует и собирает исходный код, но пропускает связывание, оставляя вам файлы .o, которые можно связать в исполняемый файл или упаковать в библиотеку.

1 голос
/ 03 февраля 2011
gcc test-1.c libdrm.c -o libdrm -l pthread
1 голос
/ 03 февраля 2011
gcc tester-1.c libdrm.c -o tester1 -l pthread

Вам нужно скомпилировать все исходные файлы за один раз, а не делать их по отдельности. Либо это, либо скомпилируйте libdrm.c как библиотеку, а затем скомпилируйте ее с tester1.c, когда вы скомпилируете это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...