Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > undefined reference to `mysql_connect'


Автор: Larrikin 19.10.2007, 17:00
делаю по этому примеру http://im-host.net/uchebnik-mysql55.html

ncalcd.c
Код

#include <common.h>
/* This is the daemon's main work */

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

void exiterr(int exitcode)
{
    fprintf(stderr, "%s\n", mysql_error(&mysql));
    exit(exitcode);
}

void ncalcd()
{
    uint i = 0;

    if (!(mysql_connect(&mysql,"host","username","password")))
        exiterr(1);

    if (mysql_select_db(&mysql,"payroll"))
        exiterr(2);

    if (mysql_query(&mysql,"SELECT name,rate FROM emp_master"))
        exiterr(3);

    if (!(res = mysql_store_result(&mysql)))
        exiterr(4);

    while((row = mysql_fetch_row(res)))
    {
        for (i=0 ; i < mysql_num_fields(res); i++)
            printf("%s\n",row[i]);
    }

    if (!mysql_eof(res))
        exiterr(5);
    mysql_free_result(res);
    mysql_close(&mysql);
}




common.h
Код

#include <err.h>
#include <errno.h>
#include <fcntl.h>
//#include <libutil.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <syslog.h>
#include <unistd.h>
#include <mysql/mysql.h>


при сборке:

gcc -c godaemon.c main.c ncalc.c -I /usr/local/include/ -I /home/larrikin/files/ncalcd
gcc  -o ncalcd godaemon.o main.o ncalc.o -L /usr/local/lib/mysql/ -l mysqlclient
ncalc.o(.text+0x5a): In function `ncalcd':
: undefined reference to `mysql_connect'
gmake: *** [ncalcd] Error 1


как правильно? нужно всего лишь работать с mysql из проги - select, insert, delete

uname -sr
FreeBSD 6.2-STABLE

Автор: JackYF 19.10.2007, 17:20
mysql сам собирал, раз в /usr/local/lib лежит?

Экспортирует ли /usr/local/lib/mysql/mysqlclient.so нужные недостающие функции?
Если установлен mc, посмотри это через F3 на этот файл и поищи там эти функции, например mysql_connect...

Автор: archimed7592 19.10.2007, 17:24
Цитата(Larrikin @  19.10.2007,  17:00 Найти цитируемый пост)
-l mysqlclient

Я не уверен, но вроде это нужно без пробела писать...

Автор: JackYF 20.10.2007, 01:22
Цитата(JackYF @  19.10.2007,  17:20 Найти цитируемый пост)
Если установлен mc, посмотри это через F3 на этот файл и поищи там эти функции, например mysql_connect... 

upd: можно намного легче:

Цитата

nm -g /usr/local/lib/mysql/mysqlclient.so | grep mysql_connect

Автор: GrayCardinal 20.10.2007, 09:55

Добавлено @ 09:55
Моды, убейте рекламу, плиз...

Автор: Larrikin 20.10.2007, 15:13
> nm -g /usr/local/lib/mysql/mysqlclient.so | grep mysql_connect
nm: '/usr/local/lib/mysql/mysqlclient.so': No such file

Автор: MAKCim 20.10.2007, 15:34
Larrikin, 
значит посмотри как библиотека называется у тебя (если она конечно есть)

Автор: Larrikin 4.11.2007, 18:28
# nm -g /usr/local/lib/mysql/libmysqlclient.so | grep mysql_connect
#

Автор: JackYF 4.11.2007, 21:46
Larrikin, итого ты сам видишь - нужной тебе функции нет. Собери еще раз, полностью мускул, а лучше установи из репозитория.

Автор: Larrikin 4.11.2007, 23:33
да я из портов и ставил... может там какие опции надо при сборке?

Автор: JackYF 5.11.2007, 02:30
Цитата(Larrikin @  4.11.2007,  23:33 Найти цитируемый пост)
да я из портов и ставил...

а, так у тебя gentoo... с этого надо было начинать.

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

Автор: orthrus 5.11.2007, 06:25
Цитата(JackYF @ 5.11.2007,  02:30)
Цитата(Larrikin @  4.11.2007,  23:33 Найти цитируемый пост)
да я из портов и ставил...

а, так у тебя gentoo... с этого надо было начинать.

Если из портов то это не gentoo а freeBSD.

Автор: archimed7592 5.11.2007, 11:14
Цитата(orthrus @  5.11.2007,  06:25 Найти цитируемый пост)
Если из портов то это не gentoo а freeBSD. 

А в генту что? rpm'ки? smile
Не помню какой МП использует FreeBSD, но точно помню, что гента использует portage и ставит она всё как раз таки из портов smile.

Автор: bsa 5.11.2007, 12:13
archimed7592, в FreeBSD все в основном ставится буквально из "портов" ("ports"). Только там не так все круто как в дженте. Чтобы что-то установить из исходников надо найти это "что-то" в /usr/ports, зайти в каталог и дать команду make install.

Автор: orthrus 5.11.2007, 13:42
В gentoo пакеты так и называется package. А во фрях порты(если из исходников собирать) или пакеты(если ставить бинарную сборку).

Автор: Larrikin 6.11.2007, 11:28
парни, как мне сделать свою первую программу, которая может делать хотя бы SELECT и INSERT на MySQL сервере через unix сокет?
> pkg_info
apache-1.3.37_1     The extremely popular Apache http server. Very fast, very c
autoconf-2.59_2     Automatically configure source code on many Un*x platforms
autoconf-2.61_2     Automatically configure source code on many Un*x platforms
autoconf-wrapper-20070404 Wrapper script for GNU autoconf
automake-1.10_3     GNU Standards-compliant Makefile generator (1.10)
automake-wrapper-20070404 Wrapper script for GNU automake
chrootuid-1.3       A simple wrapper that combines chroot(8) and su(1) into  on
cvsd-1.0.13_1       CVS pserver daemon
cvsup-without-gui-16.1h_2 General network file distribution system optimized for                                   CVS
expat-2.0.0_1       XML 1.0 parser written in C
gettext-0.14.5_2    GNU gettext package
glib-2.8.6_1        Some useful routines of C programming (current stable versi
gmake-3.81_1        GNU version of 'make' utility
help2man-1.36.4_1   Automatically generating simple manual pages from program o
jabberd-2.0.11_2    Online presence and instant messaging server
jpeg-6b_4           IJG's jpeg compression utilities
libiconv-1.9.2_2    A character set conversion library
libidn-0.6.8        Internationalized Domain Names command line tool
libtool-1.5.22_2    Generic shared library support script
libxml2-2.6.26      XML parser library for GNOME
links-2.1.p21,1     Lynx-like text WWW browser
lynx-2.8.5_2        A non-graphical, text-based World-Wide Web client
m4-1.4.4            GNU m4
mc-4.6.1_3          Midnight Commander, a free Norton Commander Clone
mu-conference-0.6.0_3 Multi-User Conferencing component for Jabber
mysql-client-5.0.27 Multithreaded SQL database (client)
mysql-server-5.0.27 Multithreaded SQL database (server)
nmap-4.11           Port scanning utility for large networks
p5-gettext-1.05_1   Message handling functions
pcre-6.7            Perl Compatible Regular Expressions library
pecl-PDO-1.0.3      PHP Data Objects Interface
perl-5.8.8          Practical Extraction and Report Language
php5-5.2.0          PHP Scripting Language (Apache Module and CLI)
php5-ctype-5.2.0    The ctype shared extension for php
php5-dom-5.2.0      The dom shared extension for php
php5-extensions-1.0 A "meta-port" to install PHP extensions
php5-iconv-5.2.0    The iconv shared extension for php
php5-mysql-5.2.0    The mysql shared extension for php
php5-pcre-5.2.0     The pcre shared extension for php
php5-posix-5.2.0    The posix shared extension for php
php5-session-5.2.0  The session shared extension for php
php5-simplexml-5.2.0 The simplexml shared extension for php
php5-sqlite-5.2.0   The sqlite shared extension for php
php5-tokenizer-5.2.0 The tokenizer shared extension for php
php5-xml-5.2.0      The xml shared extension for php
php5-xmlreader-5.2.0 The xmlreader shared extension for php
php5-xmlwriter-5.2.0 The xmlwriter shared extension for php
php5-zlib-5.2.0     The zlib shared extension for php
pkgconfig-0.20      A utility to retrieve information about installed libraries
png-1.2.14          Library for manipulating PNG images
ssh2-nox11-3.2.9.1_6 Secure shell client and server for V.2 SSH protocol
svgalib-1.4.3_5     A low level console graphics library
tiff-3.8.2_1        Tools and library routines for working with TIFF images
unzip-5.52_2        List, test and extract compressed files in a ZIP archive
> uname -sr
FreeBSD 6.2-STABLE
>

Автор: JackYF 6.11.2007, 15:13
Одна тема - один вопрос. Создавай новую.

Автор: Larrikin 6.11.2007, 17:18
а это и есть тот же вопрос! он не менялся с первого поста - мне в проге первый раз в моей жизни надо работать с MySQL и не получается. Примеры не работают из доки - что делать не знаю, только надежда на помощь зала.
Хотя бы, может, подскажите доку конкретную по работе с мускулем в бзде, только работающую и достаточную для простых случаев, как у меня - получить массив, записать строку.

Автор: bsa 6.11.2007, 18:12
Larrikin, ты бы для приличия написал что именно у тебя не работает. и как именно. А то может у тебя, например, сервер не запущен, база или таблица не созданы.

Автор: Larrikin 6.11.2007, 20:20
ээээ... первое сообщение вижу только я? продублирую, может поможет:

делаю по этому примеру http://im-host.net/uchebnik-mysql55.html

ncalcd.c
Код

#include <common.h>
/* This is the daemon's main work */

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;

void exiterr(int exitcode)
{
    fprintf(stderr, "%s\n", mysql_error(&mysql));
    exit(exitcode);
}

void ncalcd()
{
    uint i = 0;

    if (!(mysql_connect(&mysql,"host","username","password")))
        exiterr(1);

    if (mysql_select_db(&mysql,"payroll"))
        exiterr(2);

    if (mysql_query(&mysql,"SELECT name,rate FROM emp_master"))
        exiterr(3);

    if (!(res = mysql_store_result(&mysql)))
        exiterr(4);

    while((row = mysql_fetch_row(res)))
    {
        for (i=0 ; i < mysql_num_fields(res); i++)
            printf("%s\n",row[i]);
    }

    if (!mysql_eof(res))
        exiterr(5);
    mysql_free_result(res);
    mysql_close(&mysql);
}




common.h
Код

#include <err.h>
#include <errno.h>
#include <fcntl.h>
//#include <libutil.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/cdefs.h>
#include <sys/param.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <syslog.h>
#include <unistd.h>
#include <mysql/mysql.h>


при сборке:

gcc -c godaemon.c main.c ncalc.c -I /usr/local/include/ -I /home/larrikin/files/ncalcd
gcc  -o ncalcd godaemon.o main.o ncalc.o -L /usr/local/lib/mysql/ -l mysqlclient
ncalc.o(.text+0x5a): In function `ncalcd':
: undefined reference to `mysql_connect'
gmake: *** [ncalcd] Error 1


как правильно? нужно всего лишь работать с mysql из проги - select, insert, delete

uname -sr
FreeBSD 6.2-STABLE

Автор: JackYF 6.11.2007, 21:43
Larrikin, ты понимаешь, что у тебя неправильно собрана библиотека libmysqlclient, на основании которой ты собираешь писать программу? Тебе надо её пересобрать правильно, добыть/установить требуемую версию с помощью средств FreeBSD (я ими не владею, например).

Автор: Larrikin 7.11.2007, 02:36
не понимаю, как может быть неправильно собрана библиотека стандартным make install clean из свежих портов
может надо какой-нибудь особый порт ставить еще?

Автор: orthrus 7.11.2007, 06:07
попробуйте в замен функции mysql_connect использовать mysql_real_connect, у вас наверное mysql был собран без USE_OLD_FUNCTIONS а в <mysql.h> по этому поводу описано следующие:
Код

#ifdef USE_OLD_FUNCTIONS
MYSQL *        STDCALL mysql_connect(MYSQL *mysql, const char *host,
                      const char *user, const char *passwd);
int        STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
int        STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
#define     mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
#endif


да и во всех примерах идущих с mysql используется mysql_real_connect. Это все относительно mysql-5.0.34.

Автор: Larrikin 7.11.2007, 08:18
очень похоже, что дело в этом...

gcc -c godaemon.c main.c ncalc.c -I/usr/local/include/ -I/home/larrikin/files/ncalcd
ncalc.c: In function `ncalcd':
ncalc.c:18: error: too few arguments to function `mysql_real_connect'
gmake: *** [godaemon.o] Error 1


спасибо, хоть есть направление куда копать...

Автор: orthrus 7.11.2007, 09:13
посмотрите список параметров в <mysql.h>, или как его используют в тестовых примерах

Автор: bsa 7.11.2007, 12:50
Цитата(Larrikin @ 7.11.2007,  08:18)
очень похоже, что дело в этом...

gcc -c godaemon.c main.c ncalc.c -I/usr/local/include/ -I/home/larrikin/files/ncalcd
ncalc.c: In function `ncalcd':
ncalc.c:18: error: too few arguments to function `mysql_real_connect'
gmake: *** [godaemon.o] Error 1


спасибо, хоть есть направление куда копать...

http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html

Автор: Larrikin 12.2.2008, 19:38
я не понимаю, это что, сложно чтоль? просто подключиться к серверу mysql из unix на C?

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

> uname -rs
FreeBSD 6.2-RELEASE

> cat ncald.c
Код

#include <stdio.h> 
#include <mysql/mysql.h> 

int main(int argc, char *argv[]) 
{ 
        // Дескриптор соединения 
        MYSQL *conn; 
        // Получаем дескриптор соединения 
        conn == mysql_init(NULL); 
        if(conn == NULL) 
        { 
                // Если дескриптор не получен - выводим сообщение об ошибке 
                fprintf(stderr, "Error: can't create MySQL-descriptor\n"); 
                exit(1); 
        } 
        // Подключаемся к серверу 
        if(!mysql_real_connect(conn,NULL,"root",NULL,NULL,NULL,NULL,0)){ 
                // Если нет возможности установить соединение с сервером 
                // базы данных - выводим сообщение об ошибке 
                fprintf(stderr, 
                        "Error: can't connect to database %s \n", 
                        mysql_error(conn) 
                ); 
        } else { 
                // Если соединение успешно установлено, выводим фразу - "Success!" 
                fprintf(stdout, "Success!\n"); 
        } 
        // Закрываем соединение с сервером базы данных 
        mysql_close(conn); 
} 



> gcc -o ncalcd -I /usr/local/include/ ncald.c
ncald.c: In function `main':
ncald.c:18: warning: passing arg 6 of `mysql_real_connect' makes integer from pointer without a cast
/var/tmp//cclz8wKX.o(.text+0x22): In function `main':
: undefined reference to `mysql_init'
/var/tmp//cclz8wKX.o(.text+0x64): In function `main':
: undefined reference to `mysql_real_connect'
/var/tmp//cclz8wKX.o(.text+0x79): In function `main':
: undefined reference to `mysql_error'
/var/tmp//cclz8wKX.o(.text+0xb3): In function `main':
: undefined reference to `mysql_close'

> pkg_info | grep mysql-
mysql-client-5.1.21 Multithreaded SQL database (client)
mysql-server-5.1.21 Multithreaded SQL database (server)

Автор: popovb 14.2.2008, 09:31
Цитата(Larrikin @ 12.2.2008,  19:38)
я не понимаю, это что, сложно чтоль? просто подключиться к серверу mysql из unix на C?

> gcc -o ncalcd -I /usr/local/include/ ncald.c
ncald.c: In function `main':
ncald.c:18: warning: passing arg 6 of `mysql_real_connect' makes integer from pointer without a cast
/var/tmp//cclz8wKX.o(.text+0x22): In function `main':
: undefined reference to `mysql_init'
/var/tmp//cclz8wKX.o(.text+0x64): In function `main':
: undefined reference to `mysql_real_connect'
/var/tmp//cclz8wKX.o(.text+0x79): In function `main':
: undefined reference to `mysql_error'
/var/tmp//cclz8wKX.o(.text+0xb3): In function `main':
: undefined reference to `mysql_close'


Все предельно просто?

Как собираешь? Инклюды подключил. А либы?

Ясно тебе компилятор сказал, что ссылка не определена.

Добавь -L/bla-bla/mysql -lmysqlclient -lz

Автор: Larrikin 14.2.2008, 11:59
действительно, проблема была всего-лишь узнать о ключе компиляции -L smile
пока продвигаюсь дальше...

Автор: popovb 14.2.2008, 12:07
Цитата(Larrikin @ 14.2.2008,  11:59)
пока продвигаюсь дальше...

 smile 
удачи!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)