LINUX.ORG.RU

статическая библиотека с++

 ,


0

1

Здравствуйте. Возникла проблема с подключением и использованием функции с библиотеки в основной программе. Файлы библиотеки для теста:

libMy.cpp

#include "libMy.h"
int func1 (int a, int b)
{
	return a+b;
}

libMy.h:

#ifndef __INC_GAME_LIBMY_H__
#define __INC_GAME_LIBMY_H__
#include <stdio.h>
#include <cmath>
extern int func1(int a, int b);


#endif

В основной программе в main.cpp вызываю:

#include "libMy.h"
sys_err("a+b = %u", func1(3, 5));
Так же сам хейдер libMy.h с библиотеки скопировал в основную программу.

При компиляции основной программы ошибка: main.cpp: error: cannot bind non-const lvalue reference of type 'int&' to an rvalue of type 'int' sys_err(«a+b = %u», func1(3, 5));

как правильно подключить библиотеку и использовать функции с нее в основной программе? Что у меня не так в коде?



Последнее исправление: Qweqwe (всего исправлений: 1)

#include <stdio.h>

А на плюсах не #include <cstdio>?

anonymous
()
xms@XMs-desktop /tmp $ cat << EOF > libMy.cpp
#include «libMy.h»
int func1 (int a, int b)
{
return a+b;
}
EOF

xms@XMs-desktop /tmp $ cat << EOF > libMy.h

#ifndef __INC_GAME_LIBMY_H__
#define __INC_GAME_LIBMY_H__
#include <stdio.h>
#include <cmath>
extern int func1(int a, int b);


#endif
EOF

xms@XMs-desktop /tmp $ cat << EOF > main.cpp

#include <cstdio>
#include «libMy.h»



#define sys_err printf

int main()
{
sys_err(«a+b = %u», func1(3, 5));
return 0;
}
EOF

xms@XMs-desktop /tmp $ g++ -Wall -Wextra -Werror -pedantic libMy.cpp main.cpp xms@XMs-desktop /tmp $ У тебя ошибка в чём-то другом, представленный код (за небольшим исправлением) собирается

XMs ★★★★★
()

В основной программе в main.cpp вызываю

Ты вызов функции написал на верхнем уровне, где функции должны только определяться. Засунь вызов sys_err в функцию main.

i-rinat ★★★★★
()
Ответ на: комментарий от XMs

Проблема была с аргументами в sys_err. Исправил её.

Но выдается новая ошибка ПОСЛЕ компиляции(когда уже идет linking программы) основной программы: : undefined reference to `func1(int, int)'

То есть, как я понял, он не может найти саму функцию эту. Хоть и extern там есть. Как сделать чтобы он её не искал в у себя же в программе?

Еще раз все файлы:

Библиотека:

libMy.cpp:

#include "libMy.h"
int func1 (int a, int b)
{
	return a+b;
}

libMy.h:


#ifndef __INC_GAME_LIBMY_H__
#define __INC_GAME_LIBMY_H__
#include <cstdio>
#include <cmath>
extern int func1(int a, int b);
#endif

основная программа:

В makefile добавил:

-L../../libMy/lib

main.cpp:

#include "libMy.h"
int x = func1(3, 5);
sys_err("a+b = %u", x);

И сам хейдер с библиотеки тоже в основную программу закинул:

libMy.h:


#ifndef __INC_GAME_LIBMY_H__
#define __INC_GAME_LIBMY_H__
#include <cstdio>
#include <cmath>
extern int func1(int a, int b);
#endif
Qweqwe
() автор топика
Ответ на: комментарий от i-rinat

Нет, была проблема с аргументами в sys_err, исправил это, но сейчас другая ошибка(выше написал)

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

: undefined reference to `func1(int, int)’ collect2: error: ld returned 1 exit status

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

Но выдается новая ошибка

Да хорош в шоу экстрасенсов то играть! Выдай на гора, как собираешь своё хозяйство!

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

У тебя есть проблема, которую ты не можешь решить. Вероятно, ты не знаешь, куда смотреть. Но когда спрашиваешь совета на форуме, показываешь только кусочки исходников, в которых, как ты думаешь, ошибка. Здорово, да? Выбираешь куски, где может быть ошибка, но при этом (пока ещё) не обладаешь достаточными знаниями, чтобы выбрать куски, где может быть ошибка.

Проще всего получить совет, упростив работу отвечающим. Для этого нужно полностью выложить минимальный пример, на котором ошибка воспроизводится.

i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Я же выше написал всё. Или ты про что?

Командами этими собираю библиотеку:

g++ libMy.cpp -c -o libMy.o

ar cr libMy.a libMy.o

Потом libMy.a перекидываю в /usr/src/main/libMy/lib

и компилирую основную через gmake

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

Я не могу выложить весь исходный код «основной программы», т.к. он большой (сервер игры). Мне необходимо сделать библиотеку и подключить её к основной программе. Чтобы можно было вызвать функцию с библиотеки в основной программе.

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

Все содержимое задействованных файлов я прикрепил выше.

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

Если что-то еще не хватает, что я должен выложить, можешь сказать, я предоставлю. Не знаю как здесь на форуме приято просто..

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

и компилирую основную через gmake

А мы думали, что тебе помощь нужна. А ты просто прикалываешься.

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

Я не могу выложить весь исходный код «основной программы», т.к. он большой (сервер игры).

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

i-rinat ★★★★★
()
Ответ на: комментарий от roof

как обычно

gmake -j

Компилируется основная программа без добавления функция с библиотеки отлично, с этой команды.

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

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

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

Статические либы это обычные *.o файлики и собирать с ней надо как с прочими *.o файликами

gcc -o someapp main.c lib.a
sparks ★★★★
()
Ответ на: комментарий от anonymous

Какая разница, если всё равно этим линковщик будет заниматься? Так просто понятней, чем расказывать про ld, хотя можно и заменить на g++

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

Так я минимальный пример сверху прикрепил. Что ещё нужно-то?

Код не является корректным кодом на Си++:

main.cpp:

#include "libMy.h"
int x = func1(3, 5);
sys_err("a+b = %u", x);

Этот код не компилируется.

Я уже третий раз одно и то же пишу. Минимальный пример, на котором воспроизводится проблема. Можно её воспроизвести по обрывкам, что ты написал? Нет.

Возможно, кто-то чудом догадается, что у тебя там за проблема. Но только если повезёт.

i-rinat ★★★★★
()
Ответ на: комментарий от sparks

Не понял, что ты имел в виду. У меня разве не также это собирается? Только с g++ сначала библиотека, потом основная программа. Мне нужно чтобы раздельно были и библиотека и ядро игры (всего 2 файла). Чтобы через аля LD_PRELOAD мог подключить библиотеку к ядру игры.

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

Это я к примеру сказал (для динамической). Просто не знаю ещё как правильно подключить статическую.

Мне нужна только статическая.

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

Да здесь и так вас троллей хватает)

Вместо того, чтобы троллить, могли бы и подсказать что может быть не так, либо пример\гайд какой-то дать, как правильно сделать статическую библиотеку, подключить её и пользоваться ей. (g++)

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

Нужно чтобы обработка функции была в библиотеке, а вызов в основной программе.

«Не смешивайте мягкое с тёплым, получается говно».

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

Ясно, ты решил просто в топ поднимать мой топик своими сообщениями, не относящимися к теме?

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

не относящимися к теме?

Порядок main.cpp и libMy.a какой при сборке? Будь внимательней, родной!

anonymous
()
Ответ на: комментарий от i-rinat

чёт это дело начинает попахивать жирным тролингом

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

либо пример\гайд какой-то дать

Пример тебе дали выше, в нём просто надо заменить gcc на g++.

Но вообще для больших проектов все исходники и библиотеки замести в параметры g++ нереально, для этого есть системы сборки, такие как cmake или meson. И если ты действительно пишешь сервер игры, рано или поздно тебе это понадобится.

Сервер хоть открытый? Интересно же.

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

Это уже всё реализовано через Makefile.

Да, правильно ссылку дали ниже на исходник.

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

libthecore/include.rar

Это шутка такая?

И вообще, я сейчас смотрю в репозиторий, и у меня всё сильнее возникает желание предложить тебе всё снести. Какие-то бинарники (что они делают в репозитории?), какие-то мейкфайлы, а ответа на простой вопрос «как одной-двумя командами собрать всё это дело» нет и не предвидится. Я даже следов пресловутого gmake не нашёл

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

Не знаю где ты такое нашел: libthecore/include.rar

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

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

Не знаю где ты такое нашел: libthecore/include.rar

В репозитории.


Вы можете просто пример мне полный написать как подключать и использовать статичную библиотеку, этого будет достаточно

Его нельзя дать, потому что при проблемах с кодом, которые не удаётся решить «на глаз», первое желание — собрать код у себя и посмотреть выхлоп. Обычно с этого начинается разбор причин неполадок. Ты приводишь ошибки, которые лично мне у себя воспроизвести не удалось. Поэтому логично, что сборка проекта целиком — это то, что поможет мне увидеть твою ошибку и решить твою проблему. А сделать этого нельзя, потому что в репозитории вообще не пахнет организованной сборкой проекта

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