Неопределенная ссылка на функцию - PullRequest
2 голосов
/ 23 декабря 2010

У меня есть следующие каталоги в моем домашнем каталоге.

  1. source

  2. include

  3. Lib

В исходном каталоге у меня есть следующие файлы:

a.c

#include <stdio.h>
#include "a.h"

extern void function(void);

int main() 
{

    printf("PREDEFINED = %d\n",PREDEFINED); 
    function();  
    return 0; 
}

b.c

#include <stdio.h>
void function() 
{
    printf("Hello from function\n"); 
}

a.h

#define PREDEFINED 100

Я скомпилировал bc и переместил bo в папку Lib.

Затем я попытался выполнить следующую команду из source folder

gcc -Wall -o temp a.c -I../include -L../Lib

Но он показывает следующую ошибку a.c: undefined reference to function``

Но когда я использую следующую команду, она создает выходной файл temp без ошибок

gcc -Wall -o temp a.c -I../include ../Lib/b.o

Где яидет не так?

Ответы [ 2 ]

5 голосов
/ 23 декабря 2010

Объектный файл не является библиотекой. Попробуйте создать и использовать простую статическую библиотеку:

ar rcs ../Lib/libb.a b.o
gcc -Wall -o temp a.c -I../include -L../Lib -lb

Статическая библиотека обычно содержит несколько объектов. Вы бы добавили полный список объектов в строку ar. Обратите внимание, что опция -l{name} заставляет компоновщик найти файл с именем lib{name}.a.

0 голосов
/ 23 декабря 2010

В первой команде вы просто определяете Lib как место для поиска библиотек.Однако вы не указываете библиотеки для компоновки, и в любом случае путь к библиотеке не используется для поиска объектных файлов.

Во второй команде вы явно указываете объектный файл для использования в качестве входных данных для компоновщика.

Следовательно, с первой командой функция function() не найдена, а со второй командой.

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