LINUX.ORG.RU

Программирование в C, как собирать большие проекты в Makefile.am

 , ,


1

2

Привет, народ. Давненько ЛОР читаю, но пришла беда, нужна помощь.
Есть проект на Си, который нужно собрать. Но си только учил когда то, а тут надо сделать здесь и сейчас. Потом почитаю еще.
Сам проект вроде собирается и компилируются нормально. В Makefile.am есть
pkglib_LTLIBRARIES = libmyprog.la
libmyprog_la_SOURCES = env.c
libmyprog_la_LDFLAGS = -avoid-version
в результате генерируется libmyprog.la и libmyprog.so. Не понятно почему он решил собрать shared library. Все остальное для сборки самого проекта под unix, винду и цепляет для нужды проекта -lssl -lcrypto. configure.ac почти все автоматом и часть своего, но там ничего такого.
Необходимо собрать из проекта статическую библиотеку. Если как есть собрать и запустить ./configure -enable-static, соберет libmyprog.a, libmyprog.la и libmyprog.so, но в libmyprog.a собирается только один класс как и в случае с libmyprog.la.
Разное пробовал, не получается. К примеру добавил так

noinst_LIBRARIES = libmyprog.a
lib_LIBRARIES = libmyprog.a
libmyprog_a_SOURCES = $(common_headers) $(common_sources) $(unix_sources)
libmyprog_a_LDFLAGS = -L$(SSLDIR)/lib64 -L$(SSLDIR)/lib -I/usr/local/ssl/include/ -L/usr/local/ssl/lib/ -lssl -lcrypto
во время make-а, пишет что не видит openssl. Видать не цепляет -lssl -lcrypto.
Что делать? Как быть?
Напишите нормальный, полный пример для среднего проекта. Что бы любой просто глянул и сразу понял. Позже буду курить маны, сейчас надо быстрее сделать работу, а на этом застрял. Можете описать разработку проектов под unix на Си коротко и ясно? Буду вводить свой вклад в сообщество.
Для быстрого ответа лучше было написать в трекер или тут нормально? четто многоватто вопросов

Заранее благодарен.
P.S: надо через automake, autotools, Makefile.am. Руками примеры я собирал, но надо Makefile.am.



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

но в libmyprog.a собирается только один класс

Это ты как определил? И, что ещё за класс в C?

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

ar -t
и через
nm
посмотрел, показывает что там только env.c. Кроме него ничего другого там нет. А нужно что бы там весь проект был, надо его для других проектов цеплять.

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

Из твоего поста непонятно следующее:
Что ты хочешь сделать из проекта? Ты говоришь, что:

Есть проект на Си, который нужно собрать.

А потом:

Сам проект вроде собирается и компилируются нормально.

Затем вообще

Необходимо собрать статическую библиотеку.

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

libmyprog.a собирается только один класс как и в случае с libmyprog.la.

Наверное имелся ввиду объектный модуль, а не класс. Само собой, ведь оно у тебя тут же и написано, что включить в эту библиотеку:

libmyprog_la_SOURCES = env.c

Если как есть собрать и запустить ./configure -enable-static, соберет libmyprog.a, libmyprog.la и libmyprog.so, но в libmyprog.a собирается только один класс как и в случае с libmyprog.la.

Во-первых, /configure --enable-static --disable-shared.
Во-вторых, насколько мне известно, после изменения Makefile.am или configure.in необходимо заново сгенерировать сборочный скрипт ./configure.

Раз проект средний, я думаю, можно попробовать перейти на CMake или вообще Makefile. С autotools те ещё грабли.

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

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

кури man ld на предмет ключа -static

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

Нужно и сам проект собрать, и из него сделать статическую библиотеку.
Да, сам проект сделать статическую библиотеку. Проект сам тоже содержит статические библиотеки.
Ну проект нужно на autotools, да все время заново генерирую.
./configure --enable-static --disable-shared делал, так же, только env.o там есть. Можете написать полный пример? Желательно с инклудом openssl
Думаю почитать cmake давно, но сейчас надо быстро сделать.

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

Если нужно быстро сделать статическую библиотеку из проекта - компилируете свой проект как обычно, затем собираете необходимые вам объектные модули без main.o в одном месте и создаете из них статическую библиотеку:

ar rc libmyprog.a *.o
EXL ★★★★★
()
Ответ на: комментарий от zipzipzip

посмотрел, показывает что там только env.c

libmyprog_la_SOURCES = env.c

Я, конечно, в системах сборки вообще не шарю, но что хотел, то и получил, не?

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

Это понятное дело, но приведите нормальный, рабочий, понятный пример.
Я тоже не шарю, но если тогда так смотреть, то получается он отвечает сразу и за shared library и за static library. Туда libmyprog_la_SOURCES вставлял $(common_headers) $(common_sources) $(unix_sources) , и у меня выдавало что не видит в зависимости openssl. Сам проект собирается и работает. Тогда попробовал добавить _LDFLAGS, _LDADD = -L/usr/local/ssl/lib/ -lssl -lcrypto, все равно пишет что не видит его. Я просто не в понятках

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

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

все равно пишет что не видит его

Можете привести конкретный выхлоп компилятора? Может кто подскажет.

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

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

wakuwaku ★★★★
()

Возможно, посоветую очевидную вещь, но почему бы просто не глянуть в конечный Makefile, сгенерированный ./configure, и убедиться в какие команды легли добавленные опции и вообще попали ли они туда (из поста не ясно, делал ли автор autoreconf после изменения Makefile.am, а, как известно, простого ./configure в этом случае недостаточно).

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

Добавлял через myprog_LDFLAGS = libssl.a libcrypto.a ... разными способами, в lib_a_LDFLAGS и lib_la_LDFLAGS по разному добавлял. Не знаю почему не пашет.

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

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

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

Мыши плакали-кололись, но продолжали грызть autotools.

У меня времени не было все эти выходные. Занят был.

Не оправдывайся, это жалко выглядит.

Chaser_Andrey ★★★★★
()

К примеру вот так тоже попробовал
noinst_LIBRARIES = liba.a
liba_a_SOURCES = $(common_headers) $(common_sources) $(shared_sources)
liba_a_LIBADD = libssl.a libcrypto.a
bin_PROGRAMS = myprog
myprog_SOURCES = $(unix_sources)
myprog_LDADD = liba.a libssl.a libcrypto.a
но тут он не увидел #include <openssl/ssl.h> в классе который в $(common_headers). Видать даже не цепляет уже и libssl.a libcrypto.a.
Ну как сделать? Нужно просто либу собрать

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

Реально занят был.
А так, да, думаю еще минимум пару дней буду с этой проблемой сидеть. Жизнь боль...

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

ну делай, я не возражаю. почитай, нафига нужны foo_LDFLAGS и foo_LDADD в Makefile.am, раздел Linker options в man-е по gcc и man ld - тогда и сообразишь, что, как и куда тебе нужно прописывать

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

но тут он не увидел #include <openssl/ssl.h>

А он есть вообще? В cflags путь попробуй добавить.

И перепиши проект на cmake уже. Еще бы по коболу вопросы задавал.

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

Есть, добавил но не работает.
Неужели так сложно написать нормальный пример?
Хотя бы простой пример где создается библиотека которая использует статическую библиотеку openssla libssl.a и libcrypto.a. Это же элементарно. Вроде не прошу ничего сложного. Если сяду все это изучать, сделаю по своему и могу не успеть основного сделать.

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

Непонятно вот что: ты хочешь добавить в libmyprog.a заодно всё, что лежит в libssl и libcrypto? Или «всё из libssl и libcrypto, используемое программой»? В случае статических библиотек категорически не принято делать ни того, ни другого, соответственно, без нетривиальной ручной работы будет не обойтись.

Или проблема в том, что в библиотеку попадает только env.o, а есть ещё ostalnoye.c, vsjakoye.c и raznoe.c, которые не компилируются или не попадают в библиотеку? Тогда как насчёт

libmyprog_la_SOURCES=env.c ostalnoye.c vsjakoe.c raznoe.c
?

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

ну делай, я не возражаю. почитай, нафига нужны foo_LDFLAGS и foo_LDADD в Makefile.am, раздел Linker options в man-е по gcc и man ld - тогда и сообразишь, что, как и куда тебе нужно прописывать

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

На худой конец собрал бы с ./configure СFLAGS="-I/path_to_ssinclude/include" LDFLAGS="-L/path_to_sslib/lib -lcrypto -lssl".
Но, нет, нужно переливать из пустого в порожнее и править всякие «Makefile.am».

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

ТС, будь добр, предоставь листинги сборочных файлов («configure.ac», «Makefile.am») и выхлоп ./configure && make. И четко объясни структуру своего проекта, и то, что ты хочешь получить в итоге. Иначе это гадание на кофейной гуще.

Нужно и сам проект собрать, и из него сделать статическую библиотеку. Да, сам проект сделать статическую библиотеку. Проект сам тоже содержит статические библиотеки.

Слишком размыто и туманно для понимания.

Вот тебе фалйики «Makefile.am» и «configure.ac» из проекта avrdude.

Этот проект реализован в виде статической бибилотеки libavrdude.a и утилиты avrdude, к которой эта статическая библиотека цепляется.
Помимо статической библиотеки libavrdude.a, находящейся в самом проекте, к утилите линкуется еще динамические или статические (какие у тебя в системе есть, те и линкуются) библиотеки libusb, libhid, libelf, libftdi и -lm. Это можно посмотреть в «Makefile.am»:

noinst_LIBRARIES = libavrdude.a
avrdude_LDADD  = $(top_builddir)/$(noinst_LIBRARIES) @LIBUSB_1_0@ @LIBUSB@ @LIBFTDI1@ @LIBFTDI@ @LIBHID@ @LIBELF@ @LIBPTHREAD@ -lm

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

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

где создается библиотека которая использует статическую библиотеку openssla libssl.a и libcrypto.a.

Статические библиотеки не линкуются вообще. Это архивы, содержащие объектные модули и всё.

Линкуются: динамические библиотеки и исполнительные файлы.

Если сяду все это изучать, сделаю по своему и могу не успеть основного сделать.

Если ты будешь путаться в понятиях (говорить об объектном модуле как о классе, например), то есть шанс, что люди тебя не поймут. И вместо того, чтобы тратить время на решение проблемы, ты потратишь его на донесение своей мысли.

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

если можно заодно все, можно все. Можно три либы таскать. Мне без особой разницы. Главное что бы основная либа была статическая.
Писал так к примеру:

bin_PROGRAMS = myprog
myprog_SOURCES = $(unix_sources)
myprog_LDADD = liba.a libssl.a libcrypto.a

lib_LTLIBRARIES = liba.la
liba_la_SOURCES = $(common_headers) $(common_sources) $(shared_sources)
liba_la_LIBADD = libssl.a libcrypto.a
тут он не видел для $(common_headers) класса уже Опенссл. А что дальше еще не проверял. Как для начала сделать так что бы он для в моей либе видел либы ssl.a crypto.a?
По разному пробовал, не понятно мне в чем дело.

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

Тяжело когда не знаешь. Привык к Java, вот и стал таким.
Нужно просто собрать статическую библиотеку которая еще использует openssl, что бы просто передать другим свою библиотеку где все есть и что бы они просто ее добавили и ничего не делали. Совершенно ничего.
Спасибо, сегодня буду пробовать.

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

ну есть у человека желание сделать полностью статическую либу - ну бог с ним, каждый дрочит, как он хочет. пускай вот и осваивает -Wl

ananas ★★★★★
()

Вроде нормально сделал. Сейчас времени нет, как закончу постараюсь нормально расписать.

zipzipzip
() автор топика
23 декабря 2015 г.
Ответ на: комментарий от zipzipzip

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

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