LINUX.ORG.RU

подключение статической библиотеки (lib.a)

 ,


0

1

Всем привет, возникла проблема с подключением статической библиотеки. Файлы с библиотеки (для теста):

libMy.c:

#include "libMy.h"
void func1()
{
    sys_err("Test work lib");
}
libMy.h:
extern void func1();
компилирую библиотеку так:
gcc libMy.c -c -o libMy.o
ar cr libMy.a libMy.o
Подключить данную библиотеку хочу к исходникам сервера игры. Саму библиотеку (libMy.a) закинул по пути ../../libMy/lib (по отношения исходника игры).

в makefile добавил новую библиотеку:

LIBDIR +=  -L../../libMy/lib
LIBS += -lMy
Т.е добавление в makefile, как я понял, должно уже подключить библиотеку. добавил инклуд libMy.h в stack.cpp:
#include "libMy.h"
Сам хейдер выглядит так: libMy.h:
void func1();
в файле исходника игры stack.cpp вызываю так:
func1();
Уже после компиляции сервера (когда линкуется\собирается сам основной файл) выдается ошибка:
linking ../game....

stack.cpp:1728: undefined reference to `func1()'
stack.cpp:1728: undefined reference to `func1()'
collect2: error: ld returned 1 exit status
gmake: *** [../game] Error 1
Как правильно подключить статическую библиотеку?



Последнее исправление: cetjs2 (всего исправлений: 3)
Ответ на: комментарий от EXL
..................... 
*все без ошибок*
...........
Compile -> quest.cpp
Compile -> mini.c
linking ../game....
OBJDIR/stack.o: In function `CHARACTER::SendDamagePacket(CHARACTER*, int, unsigned char)':
/game/src/stack.cpp:1728: undefined reference to `func1()'
/game/src/stack.cpp:1728: undefined reference to `func1()'
collect2: error: ld returned 1 exit status
gmake: *** [../game] Error 1

Qweqwe
() автор топика
Ответ на: комментарий от xaizek

# nm libMy.a

libMy.o: 00000000 T func1 U sys_err

А если поменять libMy.c на libMy.cpp то как скомпилировать правильно? Вообще мне статическая библиотека нужна на с++

Qweqwe
() автор топика
Ответ на: комментарий от Qweqwe

А если поменять libMy.c на libMy.cpp то как скомпилировать правильно?

Наверное. Он мог по расширению гадать язык (и судя по выводу nm так и есть, если всё было сделано правильно).

Вообще мне статическая библиотека нужна на с++

Тогда стоит переименовать в любом случае.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Хотя не похоже, что g++ так гадает. Может ar не был сделан? Можно ещё libMy.a для верности сначала снести.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

хм, возник еще вопрос, я не могу в библиотеке функции void func1() использовать sys_err функцию (для вывода в лог сообщения), которая используется и создана на сервере игры?

например: в библиотеке

libMy.cpp:

#include "libMy.h"
void func1()
{
	sys_err("Test work lib");
}

но в библиотеке нигде не объявлена sys_err. должна же быть ошибка при компиляции самой библиотеки?

если компилирую в расширении .cpp то ошибка, командой:

 # g++7 libMy.cpp -c -o libMy.o
libMy.cpp: In function 'void func1()':
libMy.cpp:4:2: error: 'sys_err' was not declared in this scope
  sys_err("Test work lib");

а если в расширении libMy.c то всё компилируется без ошибок, командой:

gcc libMy.c -c -o libMy.o

Просто раньше не сталкивался с статическими библиотеками..

Qweqwe
() автор топика
Ответ на: комментарий от Qweqwe

или без добавлений в расширение .c

extern «C» { }

ошибка не вылетает, потому что компилируется пустой файл, т.к. компилятор не видит кода внутри функции? Или я вообще не пойму..

Qweqwe
() автор топика
Ответ на: комментарий от Qweqwe

должна же быть ошибка при компиляции самой библиотеки?

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

хм, возник еще вопрос, я не могу в библиотеке функции void func1() использовать sys_err функцию (для вывода в лог сообщения), которая используется и создана на сервере игры?

Можно, но нужно сделать соответствующий #include.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

То есть, нужно компилировать библиотеку в папке основной программы, и в библиотеки прописывать инклуд файлов с основной программы?

Qweqwe
() автор топика
Ответ на: комментарий от Qweqwe

Важно наличие #include, а не где находятся исходники.

xaizek ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.