LINUX.ORG.RU

Помогите с С


0

0

Сразу говорю в Си не разу не программировал. Программирую на Паскале (обьектном паскале) и Делфи и только под DOS, Win32. Из документации есть книжка старенькая, вы наверно её уже и не помните, называется "Программирование в среде Си для ПЭВМ EC", авторы С.Г. Свитковский, Т.В. Русс, Л.М. Романовская. В ней то я и разбирался с командами и вообще как программировать на Си. Программы ни разу не пытался на Си писать. А вот щас надо. И надо под Linux. Но вот одна проблемка. Мне нужно что бы мне подсказали список действий для работы с MySQL. То есть какую библотеку подключать, как конектиться к MySQL (какой командой), как сделать запрос в БД и как получить результат этого запроса, где он будет хранится. А дальше я как нить сам всё это обработаю. Напишите код для этих действий, плиз, если не лень.

Заранее спасибо.

anonymous

Первый совет используй C++ раз писал на Делфи это легче будет и быстрее...
Хоть со строчками парится не будешь(string(C++) vs char*(C))

anonymous
()

Пиши тогда уж на Kylix'e

kkk ★★
()

Спасибо, конечно. Но всё равно нужна помощь. Написал я такой код для теста: #include <mysql/mysql.h> #include <stdlib.h> MYSQL mysql; mysql_init(&mysql); mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"mysqlprog"); if (!mysql_real_connect(&mysql,"localhost","root","xxx xx","mysql",0,NULL,0)) { printf("Error\n"); } Вот после команды gcc mysqlprog.c вывелась такая бойдень: /tmp/ccSX8SsC.o: In function `main': /tmp/ccSX8SsC.o(.text+0x1e): undefined reference to `mysql_init' /tmp/ccSX8SsC.o(.text+0x37): undefined reference to `mysql_options' /tmp/ccSX8SsC.o(.text+0x60): undefined reference to `mysql_real_connect' collect2: ld returned 1 exit status Что теперь то делать, что это за ошибки с сылкой неопределённой. Напишите плиз кусок кода, который делает то же что и мой, я думаю понятно, что там требуется, только чтоб он был рабочий.

Сорри конечно, может я и задаю идиотские вопросы, но я никогда не программировал в Си тем более под Линукс.

anonymous
()

Спасибо, конечно. Но всё равно нужна помощь. Написал я такой код для теста:
#include <mysql/mysql.h>
#include <stdlib.h>
MYSQL mysql;
mysql_init(&mysql);
mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"mysqlprog");
if
(!mysql_real_connect(&mysql,"localhost","root","xxx xx","mysql",0,NULL,0))
{
printf("Error\n");
}
Вот после команды gcc mysqlprog.c вывелась такая бойдень:
/tmp/ccSX8SsC.o: In function `main':
/tmp/ccSX8SsC.o(.text+0x1e): undefined reference to `mysql_init'
/tmp/ccSX8SsC.o(.text+0x37): undefined reference to `mysql_options'
/tmp/ccSX8SsC.o(.text+0x60): undefined reference to `mysql_real_connect'
collect2: ld returned 1 exit status
Что теперь то делать, что это за ошибки с сылкой неопределённой.
Напишите плиз кусок кода, который делает то же что и мой, я думаю понятно, что там требуется, только чтоб он был рабочий.

Сорри конечно, может я и задаю идиотские вопросы, но я никогда не программировал в Си тем более под Линукс.

anonymous
()

тебе его линковать надо с MySQL либой
что-то вроде -lmysql
вообще либы лежат в /usr/lib или /usr/local/lib и называются
lib...so(для динамической линковки) и lib...a(для статической)
а gcc их подрубают ключем -l и либу пишуть без lib вначале и .so или .a
в конце

anonymous
()

Ура.... :-))) Заработало.... Надо было запустить gcc mysqlprog.c -lmysqlclient. Спасибо тебе anonymous (*) (2003-04-16 12:48:27.616279) А теперь можно немного теории, на будуще... :-)) Я перешёл с Делфи и там чтото такого не наблюдал.. Зачем нужно линковать libmysqlclient.so, если я уже написал #include <mysql/mysql.h> Я так понимаю, если какую то библиотеку используешь в директиве includ, то надо при компиляции добовлять для каждой ещё параметр -l... При этом искать какую добовлять надо перебором, потому что именна даже не совподают, как в данном случае mysql.h -- libmysqlclient.so. Или есть какой то секрет в этом отношении. Вопросик ещё, а зачем нужны библиотеки такие например как libmysqlclient.so.12 или libmysqlclient.so.12.0.0 И ещё чуть не забыл, есть ли какая нить оболочка для нормального программирования в Си, но чтобы она была не под ИКСЫ, а для консоли (пример например Borland C++ 3.1 под DOS). По этой же причине (у меня нет ИКСОВ, и они мне не нужны) я не могу использовать Kylix.

anonymous
()

Ура.... :-))) Заработало....
Надо было запустить gcc mysqlprog.c -lmysqlclient.
Спасибо тебе anonymous (*) (2003-04-16 12:48:27.616279)
А теперь можно немного теории, на будуще... :-))
Я перешёл с Делфи и там чтото такого не наблюдал..
Зачем нужно линковать libmysqlclient.so, если я уже написал #include <mysql/mysql.h> Я так понимаю, если какую то библиотеку используешь в директиве includ, то надо при компиляции добовлять для каждой ещё параметр -l... При этом искать какую добовлять надо перебором, потому что именна даже не совподают, как в данном случае mysql.h -- libmysqlclient.so. Или есть какой то секрет в этом отношении. Вопросик ещё, а зачем нужны библиотеки такие например как libmysqlclient.so.12 или libmysqlclient.so.12.0.0
И ещё чуть не забыл, есть ли какая нить оболочка для нормального программирования в Си, но чтобы она была не под ИКСЫ, а для консоли (пример например Borland C++ 3.1 под DOS). По этой же причине (у меня нет ИКСОВ, и они мне не нужны) я не могу использовать Kylix.

anonymous
()

Цыфры после .so означают версии библиотеки. Это позволяет установить в системе несколько версий одной библиотеки. В твоем случае libmysqlclient.so и libmysqlclient.so.12 скорее всего являются просто символическими ссылками на libmysqlclient.so.12.0.0.

В .h файлах лечат просто прототипы функций а об имени библиотеки, в которой они лечат информации нет. То есть вместо директивы #include <mysql/mysql.h> препроцессор подставляет его содержимое.

Ну и имя библиотеки нет нужды искать перебором. В документации к mysql должно быть описано как компилировать и линковать программу.

Была среда кажется называется motor достаточно похоже на bc3.1 под ДОС и даже понавороченней. Но имхо гораздо удобнее использовать любимый текстовый редактор для набивания кода, так что если и дальше намереваешься писать под линух советую попробовать vim -- действительно эффективная вешь, если научиться ей пользоваться.

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

Ну, в Сях всё немного по-другому. Результирующая программа собирается из объектных файлов (*.o, отдаленно напоминает по смыслу *.dcu в Дельфи), которые могут быть сами по себе, а могут быть в библиотеках (статическая библиотека - это, фактически, просто свалка объектных файлов). Объектные файлы _абсолютно_ равноправны (в отличие от Дельфи) и не содержат никаких привязок к _конкретным_ другим объектным файлам, а просто объявляют, какие символы (т.е. переменные, функции, ...) они хотят получить снаружи, а какие - наоборот, отдают наружу. Из каких других о.ф. будут взяты эти символы - абсолютно до лампочки.

Линкер (лоадер, ld) получает на входе список объектных файлов, из которых надо склеить программу. Так как явных ссылок на другие объектные файлы в них нет, то указание всех необходимых о.ф. (и библиотек) ложится на плечи программиста.

.h-файлы просто тупо вставляются в то место, где написан #include. Этим занимается не компилятор, а, так называемый, препроцессор. Т.е. компилятор, фактически, компиляет _один_ файл безотносительно к каким-либо другим объектным файлам, библиотекам и пр.

Как правило, к библиотеке прилагается пачка всяких .h-файлов. Часто бывает, что в библиотеке есть один .h-файл, который include'ит все остальные - это удобно с той точки зрения, что не надо помнить имена всех .h-файлов, но может существенно замедлить процесс компиляции (по сравнению с Паскалем он и так скоростью не блещет isn't it? :) ).

В заключение про .so - это, так называемые, shared objects (по назначению подобны dll в win). На данном уровне изложения можно считать, что они аналогичны .a (archive, статические библиотеки), в отличие от win, где у dll больше общего с .exe; только их линковка происходит при запуске, а не при компиляции. Всякие цифирьки в именах .so - это их версии. Приложения обычно указывают кокретную версию с которой они хотят линковаться, а при компиляции указывают обычно .so без цифирек (могут указывать мажорную версию), которые, как правило, являются симлинками на "текущую" версию этой библиотеки.

Консольных IDE я не знаю, если подразумевать под IDE то, что не умеет ничего, кроме того, чтобы быть IDE :) Самыми популярными "IDE" в консоли считаются vi и emacs. Линуксоиды считают, что борландовские IDE - это не IDE, а Г*, а виндузоиды - с точностью до наоборот :)

Rock
()

Большое спасибо, за небольшой теоритический курс, он даже мне помог скомпилить одну прогу из исходников. При компиляции мне писали что нет file_name.so, при поиске действительно его не было. Щас решил поискать файлы по такому шаблону, filename.so* и нашёл файл filename.so.4.0, потом сделал на него симлинк и прога нормально скомпилилась, а до этого я уже забил на неё и стал искать аналог.

anonymous
()

1) учить сначала C затем C++ 2) учить C ТОЛЬКО по книге отцов основателей Брайан Керниган, Денис Ричи Язык программирования С 3) учить C++ ТОЛЬКО по книге отца основателя Бьерна Страуструпа Язык С++ (издание ЧЕТВЕРТОЕ переработанное) 4) читать книгу по mySQL (рекомендую издательства O'Рейли - с двумя типа туканами на обложке) 5) выбирать компилятор наиболее соотвествующий стандарту - на данный момент это gcc (MinGW под масдай) 6) выбирать OS с наиболее правильной лицензией - ясен пень это Linux/GPL (а делее может кто не знает нас ожидает вкусный OS Hurd/GPL) 7) прикладывать ко всему этому мозги на благо себя и сообщества 8) Just For Jun

Fidoman

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