2015-10-14 5 views
-1

Я создал свою собственную библиотеку образцов, и я хочу использовать ее в своем основном файле. Весь мой код:Связанные статические библиотеки C

Sum.h:

#ifndef _SUM_H_ 
#define _SUM_H_ 

int add(int n1, int n2); 

#endif 

Sum.c:

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

int add(int n1, int n2) 
{ 
    return n1 + n2; 
} 

main.c:

#include "sum.h" 

int main(int argc, char* argv[]) 
{ 
    printf("%d", add(1, 2));  

    return 0; 
} 

Для использования библиотеки, я написал эти команды:

gcc -c -o sum.o sum.c

ar rcs libsum.a sum.o

gcc main.c

Моя проблема заключается в том, что последняя команда, которая компилирует главный файл, возвращает мне эту ошибку:

main.c: In function ‘main’: 
main.c:5:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default] 
    printf("%d", suma(1, 2)); 
^
/tmp/ccyhA7Bc.o: In `main' function: 
main.c:(.text+0x1a): reference to `sum' undefined 
collect2: error: ld returned 1 exit status 

Все файлы находятся в одном каталоге. Где моя ошибка? Как я могу ее исправить?

+1

Это сообщение об ошибке, в которое вы включаете представителя точного исходного кода, который вы показываете? Я не вижу _printf («% d», suma (1, 2)); _ в вашем источнике, но сообщение об ошибке, похоже, содержит этот оператор. – ryyker

+1

@ryyker: Кажется, что OP перевел код с испанского на английский, чтобы задать вопрос, но он забыл повторить сообщения об ошибках. – rodrigo

+0

Действительно ... приводит к совету: * всегда * делайте все свое кодирование на английском языке. Мне гораздо легче поделиться позже (и, возможно, найти членов команды, вкладчиков, ...) –

ответ

4

Вы связать в библиотеке, он не искал автоматически:

gcc main.c libsum.a 

Или, если вы предпочитаете:

gcc main.c -L. -lsum 

Эти опции:

  • -L. добавляет текущий каталог в путь библиотеки. Обычно включены только каталоги библиотек системы и компилятора.
  • -lsum ищет libsum.a (или libsum.so, вариант динамической библиотеки) в пути библиотеки.

Обратите внимание, что библиотека с только один объектный файл не очень полезно: вы можете просто связать с:

gcc main.c sum.o 

О предупреждении, вы должны #include <stdio.h> в каждом модуле компиляции, который использует printf(). У вас оно есть в sum.c, но это не делает объявления доступными для main.c. Если вы добавили его в sum.h, то он был бы включен (не то, что это хорошая идея добавить случайные include s в ваши файлы заголовков).

+0

приятно видеть (на практике более общий) синтаксис с помощью пути поиска в библиотеке, но ... позаботиться об этом, чтобы это отличный ответ? :) –

+0

Кроме того, вы правы насчет включения в 'sum.h', но поскольку это, кажется, вопрос новичка, немного более подробная информация об этом (явно включить туда, где нужно, планировать изменения!), Вероятно, будет приятной:) Еще очень хороший ответ! –

+0

@FelixPalmen: Хорошо, добавлено некоторое объяснение. Что касается включения, я не уверен в том, что делает OP с '', но просто добавить его там, где компилятор жалуется, как правило, достаточно, я не знаю, что еще добавить. – rodrigo

2

Использование

gcc main.c -L. -lsum 

-L для каталога и -lsum для имени библиотеки

Другая ошибка происходит потому, что вы не включили <stdio.h> для вашего main.

1

Ошибка! Давайте сначала внимание на предупреждение здесь:

main.c:5:2: warning: incompatible implicit declaration of built-in function ‘printf’ [enabled by default]

Вы забыли #include <stdio.h>. printf() заявлен там.В C не обязательно иметь декларацию функции перед ее вызовом, если у вас ее нет, предполагается, что она принимает любое количество аргументов и возвращает int. Но это просто наследие. Всегда убедитесь, что на самом деле имеют декларацию - для функций библиотеки, включают соответствующий заголовок.

Затем к ошибке компоновщика: Это легко объяснить:

gcc main.c

Эта команда пытается собрать только main.c для исполняемого файла. Это невозможно, потому что в main.c вы вызываете функцию, определенную в другом модуле, и это не magical, доступное компилятору. В вашем случае просто добавьте свою библиотеку в командную строку:

gcc main.c libsum.a

Я не пробовал прямо сейчас, но это должно сработать.

Смежные вопросы