LINUX.ORG.RU

libconfig беда с подключением

 


1

1

Здравствуйте, счас четко понимаю что забросают тапками но выхода нет.

Пытаюсь зацепить библиотеку для работы с конфиг файлами по моему мнению самый удобный формат), и наткнулся на проблему которую ранее не видел, например цепляя библиотеку ncurses достаточно было просто :

gcc functions.cpp -o functions -l ncurses

Но с libconfig этот вариант не прокатил , наткнулся лишь на одно решение тут описанное:

 gcc functions.cpp -o functions.o $(pkg-config --cflags --libs libconfig ncurses)
/usr/lib/gcc/x86_64-linux-gnu/6/../../../x86_64-linux-gnu/Scrt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status

чего ему не хватает ?

если запустить из консоли оно нормальные значения выдает или ругается? pkg-config --cflags --libs libconfig ncurses Похоже, линкер ругается что не может найти main()

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

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

faster@ubuntu:~$ pkg-config --cflags --libs libconfig ncurses
-D_GNU_SOURCE -lconfig -lncurses -ltinfo

Сорцы попросил

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

Каким образом расширения то тут вообще привязаны ?

Не знаю важно это или нет но у меня привычка разделять .c и .cpp

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

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

Я полагал я то если есть include <libconfig.h> то где то есть либа которая все сама подтянет с чем и пролетел , если с ncurses z разобрался скормив -l ncurses подтянув либу то с либконфиг так не прошло , и я в ступоре ибо найти нигде ответа не могу. а сейчас с головой кидаться в другой компилятор это как пике

Fastereus
() автор топика

Минимальный пример типа такого компилируется?

vadim@aquila:/tmp$ cat 1.cpp
#include <stdio.h>
#include <libconfig.h>

int main(void)
{
    printf("test\n");
    return 0;
}
vadim@aquila:/tmp$ g++ $(pkg-config --cflags --libs libconfig ncurses) 1.cpp && ./a.out 
test
vadim@aquila:/tmp$ 
Deleted
()
Ответ на: комментарий от Fastereus

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

Тогда всё ясно. Ты хочешь просто объектный файл получить? В этом случае ты забыл ключ -c, чтобы отключить линковку.

gcc (или g++) — это обёртка, которая вызывает все шаги компиляции: трансляцию в ассемблер, ассемблирование объектников и линковку исполняемого файла. Логично, что линкёр не может найти main, которая необходима для полноценной программы.

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

тогда как мне переделать мой мэйк?

#Coder Makefile

coder: ./out/main.o ./out/functions.o
	gcc -o coder ./out/main.o ./out/functions.o -l ncurses
	@echo "--->Build complited."

./out/main.o: ./src/main.cpp
	gcc -c -o ./out/main.o ./src/main.cpp

./out/functions.o: ./src/functions.cpp
	gcc -c -o ./out/functions.o ./src/functions.cpp

clean:
	rm ./out/*.o coder

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

и если не затруднит подробно объяснить конструкцию

g++ $(pkg-config --cflags --libs libconfig ncurses) 1.cpp && ./a.out 

Именно (.....) &&

Честно говоря пока это не догоняю ...

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

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

Что-то типа такого:

PACKAGES := libconfig ncurses
PACKAGES_CFLAGS := $(shell pkg-config --cflags $(PACKAGES))
PACKAGES_LIBS := $(shell pkg-config --libs $(PACKAGES))

coder: ./out/main.o ./out/functions.o
	g++ $(PACKAGES_LIBS) -o coder ./out/main.o ./out/functions.o

./out/main.o: ./src/main.cpp
	g++ $(PACKAGES_CFLAGS) -c -o ./out/main.o ./src/main.cpp

./out/functions.o: ./src/functions.cpp
	g++ $(PACKAGES_CFLAGS) -c -o ./out/functions.o ./src/functions.cpp

Вроде компилируется, но у меня там «хелло-ворлд» в исходниках, а не реальный код:

vadim@aquila:/tmp/111$ make
g++ -D_GNU_SOURCE -D_DEFAULT_SOURCE -c -o ./out/main.o ./src/main.cpp
g++ -D_GNU_SOURCE -D_DEFAULT_SOURCE -c -o ./out/functions.o ./src/functions.cpp
g++ -lconfig -lncursesw -o coder ./out/main.o ./out/functions.o

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

Именно (.....) &&

Честно говоря пока это не догоняю ...

Тут ничего сложного нет. Здесь написано: «запустить g++ подставив в качестве аргументов вывод pkg-config и файл 1.cpp И ЗАТЕМ запустить ./a.out»

&& в оболочке означает «выполнить следующую команду, если предыдущая выполнилась успешно».

a.out - это имя файла, который создаёт g++, если имя не указано ключём -o.

Deleted
()
Ответ на: комментарий от Deleted
faster@ubuntu:~/coder$ make
g++ -lconfig -lncurses -ltinfo -o coder ./out/main.o ./out/functions.o
./out/functions.o: In function `Init()':
functions.cpp:(.text+0x11): undefined reference to `initscr'
functions.cpp:(.text+0x40): undefined reference to `noecho'
functions.cpp:(.text+0x45): undefined reference to `refresh'
./out/functions.o: In function `Exit()':
functions.cpp:(.text+0x51): undefined reference to `endwin'
./out/functions.o: In function `GetConfig()':
functions.cpp:(.text+0x88): undefined reference to `config_init'
functions.cpp:(.text+0x9b): undefined reference to `config_read_file'
functions.cpp:(.text+0xb0): undefined reference to `config_destroy'
./out/functions.o: In function `InitColors()':
functions.cpp:(.text+0xda): undefined reference to `has_colors'
functions.cpp:(.text+0xed): undefined reference to `start_color'
functions.cpp:(.text+0x113): undefined reference to `init_pair'
functions.cpp:(.text+0x127): undefined reference to `init_pair'
./out/functions.o: In function `test()':
functions.cpp:(.text+0x145): undefined reference to `move'
functions.cpp:(.text+0x15e): undefined reference to `newwin'
functions.cpp:(.text+0x178): undefined reference to `box'
functions.cpp:(.text+0x184): undefined reference to `wrefresh'
functions.cpp:(.text+0x18b): undefined reference to `stdscr'
functions.cpp:(.text+0x193): undefined reference to `wgetch'
functions.cpp:(.text+0x19a): undefined reference to `stdscr'
functions.cpp:(.text+0x1ac): undefined reference to `wattr_on'
functions.cpp:(.text+0x1bd): undefined reference to `printw'
functions.cpp:(.text+0x1c2): undefined reference to `refresh'
functions.cpp:(.text+0x1c9): undefined reference to `stdscr'
functions.cpp:(.text+0x1d1): undefined reference to `wgetch'
functions.cpp:(.text+0x1dd): undefined reference to `delwin'
functions.cpp:(.text+0x1e2): undefined reference to `endwin'
collect2: error: ld returned 1 exit status
Makefile:6: recipe for target 'coder' failed
make: *** [coder] Error 1

в общем все что касалось ncurses куда то делось ...

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

Хз. Засунул в исходник простейший код с ncurses, всё работает.

#include <ncurses.h>

int main()
{
    initscr();
    printw("Hello world!\n");
    refresh();
    getch();
    endwin();
    return 0;
}
Deleted
()
Ответ на: комментарий от akk

ну до такого я додумался сам , и результат был совсем тот же

faster@ubuntu:~/coder$ g++ -lconfig -l ncurses -o coder ./out/main.o ./out/functions.o
./out/functions.o: In function `Init()':
functions.cpp:(.text+0x11): undefined reference to `initscr'
functions.cpp:(.text+0x40): undefined reference to `noecho'
functions.cpp:(.text+0x45): undefined reference to `refresh'
./out/functions.o: In function `Exit()':
functions.cpp:(.text+0x51): undefined reference to `endwin'
./out/functions.o: In function `GetConfig()':
functions.cpp:(.text+0x88): undefined reference to `config_init'
functions.cpp:(.text+0x9b): undefined reference to `config_read_file'
functions.cpp:(.text+0xb0): undefined reference to `config_destroy'
./out/functions.o: In function `InitColors()':
functions.cpp:(.text+0xda): undefined reference to `has_colors'
functions.cpp:(.text+0xed): undefined reference to `start_color'
functions.cpp:(.text+0x113): undefined reference to `init_pair'
functions.cpp:(.text+0x127): undefined reference to `init_pair'
./out/functions.o: In function `test()':
functions.cpp:(.text+0x145): undefined reference to `move'
functions.cpp:(.text+0x15e): undefined reference to `newwin'
functions.cpp:(.text+0x178): undefined reference to `box'
functions.cpp:(.text+0x184): undefined reference to `wrefresh'
functions.cpp:(.text+0x18b): undefined reference to `stdscr'
functions.cpp:(.text+0x193): undefined reference to `wgetch'
functions.cpp:(.text+0x19a): undefined reference to `stdscr'
functions.cpp:(.text+0x1ac): undefined reference to `wattr_on'
functions.cpp:(.text+0x1bd): undefined reference to `printw'
functions.cpp:(.text+0x1c2): undefined reference to `refresh'
functions.cpp:(.text+0x1c9): undefined reference to `stdscr'
functions.cpp:(.text+0x1d1): undefined reference to `wgetch'
functions.cpp:(.text+0x1dd): undefined reference to `delwin'
functions.cpp:(.text+0x1e2): undefined reference to `endwin'
collect2: error: ld returned 1 exit status

"--no-as-needed" Что это ?

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

У меня компилируется твой код. 64-битный свежий Арч. Не знаю, что там в Убунте. Странно.

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

https://stackoverflow.com/questions/16192087/undefined-reference-to-initscr-n...

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

coder: ./out/main.o ./out/functions.o
	g++ -o coder ./out/main.o ./out/functions.o $(PACKAGES_LIBS)

Странно, что у меня работает. Чё-то я в этой gcc магии позабыл, что ли.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

заработало ... афигеть и какой шанс у меня был догуглиться до этого решения ?

Два дня башку ломаю...

Теперь вопрос а случаем нет никаких утилит для програмеров, ну что то типа менеджера майкфайла , я молчу про IDE ... гугл меня послал в пень...

Неужели для консоли нет ничего ?

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

афигеть и какой шанс у меня был догуглиться до этого решения ?

Я гуглил ncurses undefined reference

IDE

Да полно всяких, но я не посоветую, т.к. не пользуюсь. geany, Code::Blocks... Но сейчас тебе посоветуют освоить vim и будут правы. :D

менеджера майкфайла

CMake? Autotools? «Простенький» скрипт для аутотулза выглядит не проще мейкфайлов: https://github.com/sde-gui/waterline/blob/master/configure.ac XD

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

Чё-то я в этой gcc магии позабыл, что ли.

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

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

Это-то я вспомнил, прочитав обсуждение. А вот почему у меня работает в обратном порядке, не понял. Может в gcc 7 что-то изменилось?

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

Мда , тут я несного разочарован , аскетизм конечно хорошо но не всегда , на сколько мне помнится в досе аж в 80х годах тыл TASM с прекрасным IDE для асемблера про ПАСКАЛЬ вообще молчу , неужели нет ничего подобного для среды где консоль осново пологающая ...

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

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

Ребят спасибо большое ... видимо я еще не раз зайду ... хоть и неприятно себя валенком ощущать но ниче не поделаешь , искать тоне зная что в том не зная в чем , весьма печально ...

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

А вот почему у меня работает в обратном порядке, не понял. Может в gcc 7 что-то изменилось?

Скорее непонятно, почему у ТСа не работает. У меня 4.8. gcc сам переставляет -l в конец, запустите с ключём -v — увидите.

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

Будешь смеяться, но... VIM

https://www.youtube.com/watch?v=XA2WjJbmmoM

По поводу написания Makefileов советую почитать книжку https://books.google.ru/books?id=z1YHCgAAQBAJ&printsec=frontcover&dq=... (достаточно будет первую главу, а там уже как втянешься...)

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

Проблема не в моём незнании и не понимании Си, а в окружающей среде, я очень много включая низкий уровень писал на форточках, начиная с досов, последние 10 лет я в принципе серезно пишу только для PLC и то там чаще в ASM скатываться приходится для экономии ресурсов, сейчас встала задача переползать на 32 бита и естественно городить свой огород и совершеть подвиг торвальдса я ненамерян, точнее нет столько времени... вот и осваиваю новую среду, а новая среда это тонна новых проблем, даже видя ключи и понимая что они значат можно пролететь с порядком, и то что для тебе логично по мне так без разницы, я не говорю что я прав нет я не прав, и большое спасибо за помощь тут главное пнуть ежа а дальше сам лапами замашет ...

По майкфайлам , есть описание синтаксиса в принципе он прост

Скорее непонятно, почему у ТСа не работает. У меня 4.8. gcc сам переставляет -l в конец, запустите с ключём -v — увидите.

gcc version 6.3.0 20170406 (Ubuntu 6.3.0-12ubuntu2)

Странно все это но не важно ... главное что стало собираться все ...

Теперь уткнулся в проблему вывода псевдографики ... и все что нашел пока не как не помогает :(пока гуглю ..

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