LINUX.ORG.RU

Файлы СТАНДАРТНЫХ библиотек Си

 


0

3

Здравствуйте!

Знакомлюсь с языком Си (GNU, ANSI ...) - типа «от азов». Изучил К&R, покурил разные маны и туторы. Нигде не встретил ответа на простой вопрос: как в конкретной операционной системе при сборке проекта и подключении стандартных Си библиотек находить названия файлов для линковки?

Например: в исходнике пишем инклуд на <math.h> а при сборке указываем библиотеку " -lm"! Почему не " -lmath"? Я конечно по форумам нашел, что оказывается файл библиотеки - «m.so»! А где это найти в системе? Где для хедеров стандартных библиотек «секретные» списки названий файлов для сборки?

Может я не так у Гугля спрашиваю, а то он меня все в разные мануалы тычет, где ничего про это не сказано.

==== ЕСТЬ ОТВЕТ ====

Для систем на платформе Linux:

1. Для стандартной библиотеки ищем в мануале по имени функции:

$ man sin | grep Link
       Link with -lm.
$ man cosf | grep Link
       Link with -lm.

2. Для расширений можно посмотреть командой:

$ pkg-config --cflags --libs freeglut
-lglut

В MS-Windows при использовании MinGW аналогично:

f:\cDev>pkg-config --cflags --libs libpng
-If:/cDev/mingw64/i686/include/libpng14  -Lf:/cDev/mingw64/i686/lib -lpng14


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

Может я не так у Гугля спрашиваю, но он меня все в разные мануалы тычет.

Боюсь, что на ЛОР-е будет точно так же. Смотри документацию к своему компилятору и библиотеке которую юзаешь.

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

Находить гуглом, тк implementation specific.

anonymous
()

Можно в пакетах смотреть.

anonymous@work:~$ dpkg -S scrnsaver.h
libxss-dev:amd64: /usr/include/X11/extensions/scrnsaver.h

anonymous@work:~$ dpkg -L libxss-dev | grep '\.so$'
/usr/lib/x86_64-linux-gnu/libXss.so
anonymous
()
Ответ на: комментарий от peregrine

ну да, согласен. Только например «man math.h» выдает все то-же описание но без «implementation specific».

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

Я про стандартные (OpenGL для примера был) библиотеки пишу. Их всего десятка два набирается - перечень есть в любом мануале по Си. При этом ни в одном месте нет названий файлов для динамической линковки а везде тупо копируется фраза «особенности в зависимости от операционной системы». Какая на..й особенность у Линуксов? И для каждого хедера надо тупо по полчаса тратить в поисках его динамической реализации?!

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

внезапно, но си есть не только на этих ваших линуксах, оттого и > в зависимости от операционной системы

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

;-) спасибо, я не знал, что мой домашний Win'10 c MinGW для тестовых сборок - не Линукс.

Я намеренно сужаю круг упрощая задчу. Думаю, что если получится найти такой список для Linux, то дальше дело пойдет легче.

Может у Вас есть такой список для MinGW?

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

Почему не " -lmath"?

Исторически, да и с libc подобие.

что оказывается файл библиотеки - «m.so»!

libm.so*

А где это найти в системе?

/usr/lib64

Где для хедеров стандартных библиотек «секретные» списки названий файлов для сборки?
он меня все в разные мануалы тычет, где ничего про это не сказано.

Да ладно:

@[~]$ man fabs | grep Link
       Link with -lm.
@[~]$ man getcpuclockid | grep Link
       Link with -lrt.

Стандартная библиотека C одна и обычно разделена на две части: libc и libm. Остальное это уже POSIX.

Примерный список таков:

libc.a  libcrypt.a  libdl.a  libm.a  libpthread.a  libresolv.a  librt.a  libutil.a  libxnet.a

Смотреть по манам. Хотя в man pthread* что-то не вижу.

xaizek ★★★★★
()

GNU ANSI

Это оксюморон.

Где для хедеров стандартных библиотек «секретные» списки названий файлов для сборки?

В целом для больших библиотек (в т.ч. стандартной) отношение .h к .so не один к одному, а много к одному. В конце концов, большинство функций реализовано в libc.so, а она подключается имплицитно. .h нужны только компилятору, а .so — только линкеру.

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

про m.so конечно ляп - на Арче вобще «/usr/lib/libm.so.6». Я тут уже дошел до

$ ldd -d test/artst
	linux-vdso.so.1 (0x00007ffecf78e000)
	libm.so.6 => /usr/lib/libm.so.6 (0x00007f38c1698000)

А в целом, спасибо за ответ, так гораздо легче. Хотя теперь окончательно понятно, что таких «списков» в природе не существует.

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

оксюморон

Улыбнуло! Это я сгоряча.

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

... заметил, что надо ставить "-lglut -lfreeglut" а не наоборот ;-)

Или это слишком тонкая шутка или я не понимаю, зачем тебе оба сразу.

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

Я реально не знал, спасибо! Мне надо было всего лишь

$ man sin | grep Link
       Link with -lm.

А я Гугля полдня напрягал! :-)

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

Почему не " -lmath"?

потому что библиотека называется libm.so, а не libmath.so.

А где это найти в системе?

/usr/lib, /usr/x86_64-unknown-linux-gnu/lib, /lib, и т.д. - зависит от настроек сборочного окружения. все эти пути задаются где-то в конфигах gcc/clang в /etc или в /usr, либо при их сборке, либо параметрами командной строки и переменными окружения при сборке твоей программы.

но все это компиляторо-осе-зависимо, и в общем случае определяется сборщиками/разработчиками оных компиляторов и SDK.

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

Какая на..й особенность у Линуксов?

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

И для каждого хедера надо тупо по полчаса тратить в поисках его динамической реализации?!

лолшто? объясни, что и зачем ты ищешь? нету в си такого понятия, как «динамическая реализация хедера».

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

спасибо за критику, приятно что кто-то читает. Тема закрыта.

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

короче, я понял. ты думаешь, что каждый .h имеет соответствующую ему .so, но это бред. на самом деле .h файлы — это в основном объявление типов, сигнатур функций, и т.п.

на 1 .so файл может быть 200 хедеров.

например, реализация функций, объявленных в string.h, stdio.h, stdlib.h и т.п. сидит в 1 библиотеке libc.so.

и да, эта проблема существует — нет стандартного способа найти в каком же модуле сидит нужная функция. я использую find + grep.

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

;-) а ты попробуй собери для теста.

попробовал

$ cat glut_test.c 

#include <GL/glut.h>

void displayCall() {
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glEnable(GL_DEPTH_TEST);
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glOrtho(-2.0, 2.0, -2.0, 2.0, -2.0, 500.0);
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  gluLookAt(2, 2, 2, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
  glScalef(.005,.005,.005);
  glRotatef(20, 0, 1, 0);
  glRotatef(30, 0, 0, 1);
  glRotatef(5, 1, 0, 0);
  glTranslatef(-300, 0, 0);
  glColor3f(1,1,1);
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'H');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'e');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'o');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'W');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'o');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'r');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'l');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, 'd');
  glutStrokeCharacter(GLUT_STROKE_ROMAN, '!');
  glutSwapBuffers();
}

int main(int argc, char** argv) {
  glutInit(&argc, argv);
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
  glutInitWindowSize(500, 500);
  glutInitWindowPosition(300, 200);
  glutCreateWindow("Hello World!");
  glutDisplayFunc(displayCall);
  glutMainLoop();
  return 0;
}
$ cat Makefile 
all:
        gcc glut_test.c -lGL -lGLU -lglut -o glut_test
$ ls -lh
итого 8,0K
-rw-r--r-- 1 lesnikov users 1,3K сен  1 10:55 glut_test.c
-rw-r--r-- 1 lesnikov users   53 сен  1 10:56 Makefile
$ make
gcc glut_test.c -lGL -lGLU -lglut -o glut_test
$ ls -lh
итого 28K
-rwxr-xr-x 1 lesnikov users  18K сен  1 10:57 glut_test
-rw-r--r-- 1 lesnikov users 1,3K сен  1 10:55 glut_test.c
-rw-r--r-- 1 lesnikov users   53 сен  1 10:56 Makefile
$ ./glut_test 
$ 
ozkriff
()
Ответ на: комментарий от deep-purple

Смотри, скоро ты еще наткнешься и на определенный порядок объявления этих -l*

причем этот порядок бывает еще и разный в разных дистрах.

в одном дистре работает, в другом нет. меняешь местами - начинает работать везде.

этому вообще есть какое-то объяснение? я чета не знаю что у гугла спрашивать :)

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

Давайте по порядку.

Файлы СТАНДАРТНЫХ библиотек Си

Курим мануал на Standart Lib C (GLibC, Microsoft C Run-time Library, dietlibc, uClibc, Newlib, klibc, eglibc) или что у вас там вместо них.

Я про стандартные (OpenGL для примера был) библиотеки пишу.

OpenGL ни разу не попадает в стандарт C. Это внешняя библиотека, и как с ней работать написано в документации по ней.

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

Скорее всего этот бардак из за новомодных символических ссылок ну или кривого патчинга линкера.

robot12 ★★★★★
()

pkg-config

Пример:

$ pkg-config --cflags --libs sdl
-D_GNU_SOURCE=1 -D_THREAD_SAFE -I/usr/local/include/SDL -L/usr/local/lib -lSDLmain -lSDL -Wl,-framework,Cocoa

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

объяснение в документации на линкер, сначала указываются объектные файлы с зависимостями, а потом их зависимости, если liba.so зависит от libb.so (вызывает функции из libb), то указывать надо в порядке -la -lb

Harald ★★★★★
()

В общем случае - никак, обычно в документации на стандартную библиотеку указывается нужный файл для линковки

Т.е. для линукса смотрим man имя_функции, там нужная библиотека указывается

Для винды смотрим на MSDN

Для яббла на developer.apple.com или в манах

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

и да, эта проблема существует — нет стандартного способа найти в каком же модуле сидит нужная функция. я использую find + grep.

Во многих случаях работает man funcname

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

;-) а ты попробуй собери для теста.

попробовал

быстро, молодец. Извини, что не пояснил. Дело в том, что на Archlinux нет (по-умолчанию) библиотеки glut. Вместо нее тут система создает линк на freeglut. Поэтому мне приходится собирать так:

LFLAGS_LIN=-g -Wall -l glut -l GL -l GLU -L "libs/freeglut/lib"

Просто по аналогии немного упростил " -L \«libs/freeglut/lib\» " в «lfreeglut».

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

да, xaizek про это уже написал:

$ man sin | grep Link
       Link with -lm.
$ man cosf | grep Link
       Link with -lm.

Действительно, я не разобрался вначале - думал, что .h библиотек однозначно привязаны к бинарникам в соотношении «один-к-одному».

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

в разные мануалы тычет, где ничего про это не сказано

В манах сказано: «Link with -lm.».

Почему не " -lmath"?

Потому, что в системе нет libmath.so. Вот если написать свою библиотеку, в реализации которой будет libmath.so, вот тогда её подключать надо будет через "-lmath". А libm.so подключается через "-lm".

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

Потому, что в системе нет libmath.so

тут мы уж догадались сами.

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

занятно. Попробовал:

$ pkg-config --cflags --libs freeglut
-lglut 
bigov
() автор топика
Ответ на: комментарий от bigov

вряд ли это тебе поможет, но, возможно, будет приятно знать, что твои пожелания учли в наследнике unix — plan9:

man 2c

A #pragma of the form #pragma lib «libbio.a» records that the program needs to be loaded with file /$objtype/lib/libbio.a; such lines, typically placed in library header files, obviate the -l option of the loaders.

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

;-) ребята понимают, что мир надо менять.

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

тогда go можно сразу учить, там еще сильнее учли эти пожелания))

ozkriff
()

Фигассе! Тут недавно пытался cairo прикрутить на MinGW. Недолго боролся, много плевался. Бросил. А оказывается надо было просто посмотреть:

f:\cDev>pkg-config --cflags --libs cairo
-mms-bitfields -If:/cDev/mingw64/i686/include/cairo -If:/cDev/mingw64/i686/include/glib-2.0 -If:/cDev/mingw64/i686/lib/glib-2.0/include -If:/cDev/mingw64/i686/include/pixman-1 -If:/cDev/mingw64/i686/include -I/opt/windows_32/include -I/opt/windows_32/include/freetype2 -If:/cDev/mingw64/i686/include/freetype2 -If:/cDev/mingw64/i686/include/libpng14  -Lf:/cDev/mingw64/i686/lib -lcairo

Разве ТАКОЕ по описанию сам найдешь?

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

Из мана pthreads(7):

Since glibc 2.3.2, the getconf(1) command can be used to determine the system's threading implementation, for example:

bash$ getconf GNU_LIBPTHREAD_VERSION
    NPTL 2.3.4
With older glibc versions, a command such as the following should be sufficient to determine the default threading implementation:
bash$ $( ldd /bin/ls | grep libc.so | awk '{print $3}' ) | \
  egrep -i 'threads|nptl'
   Native POSIX Threads Library by Ulrich Drepper et al

Как бы ньюансы... :-)

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

Например: в исходнике пишем инклуд на <math.h> а при сборке указываем библиотеку " -lm"! Почему не " -lmath"?

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

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