LINUX.ORG.RU

Как писать библиотеки

 ,


0

2

Собственно сабж таков. Как правильно разрабатывать библиотеки в GNU/Linux?
Допустим пишу я мега крутую либу, которая мега круто выводит Hello World на консоль.
hello.h

#ifndef hello_h
#define hello_h

#include <stdio.h>

void hello(void);

#endif /* hello_h */
hello.c
#include "hello.h"

void hello(void)
{
    printf("Hello World\n");
}
3 месяца кропотливого труда не прошли даром и она работает. А как в процессе работы её проверять на работоспособность?
Понятно, что надо написать не менее крутой main.c и с помощью него, gcc и такой-то матери вызвать hello. Убедиться в работоспособности на данный момент и продолжать писать остальные фичи для библиотеки.
А есть ли инструменты, позволяющие упростить этот процесс?

★★★★

можно определить main() {} в main.c, в который натыкать тестов, и потом запускать библиотеку прямо из консоли. пруф:

~$ /lib/libc.so.6 
GNU C Library (GNU libc) stable release version 2.19, by Roland McGrath et al.
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.8.2 20140206 (prerelease).
Compiled on a Linux 3.13.2 system on 2014-02-28.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B                                                                                                                                                                                                                                                         
libc ABIs: UNIQUE IFUNC                                                                                                                                                                                                                                                        
For bug reporting instructions, please see:                                                                                                                                                                                                                                    
<https://bugs.archlinux.org/>.

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

Это похоже на то, что нужно. Спасибо. Ознакомлюсь.

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

что там не ясно-то? вначале собираете библиотеку, потом собираете программу с этой библиотекой.

если первый не ясен, воторой ясности не внесет

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

Там написано то, о чём я и написал. Пишу библиотеку, собираю, пишу утилиту, в которой дёргаю библиотеку, собираю, проверяю этой утилитой. А я ищу утилиту, которая бы делала это сама(почти). Я натравил её на библиотеку, указав нужную функцию. Она её вызвала и показала результат. Это как раз по второй ссылке.

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

Наткнулся(после вашей ссылки) на dltest.
Например:

[archie@archie-laptop workspace]$ dltest /usr/lib/libglfw.so glfwInit
SUCCESS: Loaded /usr/lib/libglfw.so
SUCCESS: Found glfwInit
Вот примерно такое я и ищу, но возвращающую результат.

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

Это мне и надо. Подобно dltest указываю библиотеку и нужную функцию. Ответом в stdout мне пишется результат её работы.
Но сдаётся мне, что такого велосипеда просто нет. Но я надеюсь на это.

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

чтобы был результат работы, нужно иметь входные параметры, в glibc и в других libc, например uclibc есть наборы тестов для библиотечных вызовов

IvanR ★★★
()

Прикольно. libc выдаёт при запуске свою версию:

$ /lib/x86_64-linux-gnu/libc.so.6
GNU C Library (Debian EGLIBC 2.18-4) stable release version 2.18, by Roland McGrath et al.
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 4.8.2.
Compiled on a Linux 3.12.6 system on 2014-03-02.
Available extensions:
        crypt add-on version 2.1 by Michael Glad and others
        GNU Libidn by Simon Josefsson
        Native POSIX Threads Library by Ulrich Drepper et al
        BIND-8.2.3-T5B
libc ABIs: UNIQUE IFUNC
For bug reporting instructions, please see:
<http://www.debian.org/Bugs/>.

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

Я так понимаю мне самому надо написать утилиту, использующую dlopen/dlerror/dlsym/dlclose. Принимающую в качестве аргументов соответствующую библиотеку, вызываемую функцию и аргументы вызываемой функции(если таковые имеются). Это для простейшего определения работоспособности. Готовых инструментов нет.

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

наверно нет, приятно быть первым, даже если цель сомнительная)))

если есть идея потренироваться в написании программ на си, то был как-то у меня успешно брошенный проект.

программа должна парсить немного модифицированный XDXF

модификации не большие, там длительность показа конкретного слова в секундах, enable/disable для каждого слова и частота показа от 1-го, до 10-ти, типа рейтинга и например фоновый цвет.

и выводить на экран с помощью какой-нибудь cairo окошки со словами и переводом

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

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

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

Я вообще не программист. Только учусь. До тестов ещё доберусь. Но... Кроме меня и моего параноидального альтер эго этот код вряд ли кто-то увидит. Так есть ли смысл?

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

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

yacuken ★★★★
() автор топика

Зачем все выше отписавшиеся предлагают динамически подгружать полученную библиотеку во время исполнения?

Линкуй при компиляции.

gcc <some_args> -L/path/to/library -I/path/to/library/header -llibrary

И просто вызывай ее функции,

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

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

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

Я в таких случаях линкую модульные тесты с библиотекой.

Занимает меньше времени, зачем тратить больше? :)

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

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

Я в таких случаях линкую модульные тесты с библиотекой.
Занимает меньше времени, зачем тратить больше? :)

Можно подробнее?

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

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

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

alexku
()

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

anonymous
()

Я правильно понимаю, что у программистов на Си вопрос «как делать юнит-тесты» вызывает непонимание, бессилие, отчаяние и панику?

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