EDIT: Eu resolvi meu problema - Eu estava editando o arquivo de inclusão errado. Veja o final deste post para a correção.
Estou migrando alguns aplicativos de um servidor antigo do FreeBSD 4.3 para um novo servidor do FreeBSD 10. Estes são aplicativos C que usam a API C do MySQL. Eles são muito antigos e usam a função mysql_connect
(que é obsoleta em versões mais recentes do MySQL). Pelo que eu posso encontrar olhando para a fonte do MySQL, a API do cliente MySQL precisa ser compilada com USE_OLD_FUNCTIONS
. Infelizmente não consigo descobrir como fazer isso. Estou tentando instalar o MySQL 5.6 com o sistema de portas do FreeBSD. Eu fiz o seguinte, que acho que deveria funcionar:
cd /usr/ports/databases/mysql56-client
make fetch
make extract
make configure
Eu editei work/mysql-5.6.16/include/config.h
e adicionei a seguinte linha no final:
#define USE_OLD_FUNCTIONS
Depois eu compilei e instalei o cliente:
make
make install
mysql_config
mostra o seguinte:
# mysql_config --libs
-L/usr/local/lib/mysql -lmysqlclient -pthread -lm
# mysql_config --cflags
-I/usr/local/include/mysql -pipe -fno-strict-aliasing -g -DNDEBUG
Quando tento compilar um cliente de teste muito simples, mostrado abaixo, recebo um erro de vinculador que diz undefined reference to 'mysql_connect'
. O código do cliente de teste é o seguinte:
#define USE_OLD_FUNCTIONS
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
MYSQL *sock;
sock = mysql_connect(NULL, NULL, "root", "test");
mysql_close(sock);
}
Quando eu tento compilá-lo, recebo um erro de vinculador:
# clang -o test -I/usr/local/include/mysql -pipe -fno-strict-aliasing -g -DNDEBUG test.c -L/usr/local/lib/mysql -lmysqlclient -pthread -lm
/tmp//ccTJC9Ov.o: In function 'main':
/root/admin/test.c:8: undefined reference to 'mysql_connect'
collect2: ld returned 1 exit status
O programa de teste a seguir, que usa a função mysql_real_connect
mais recente, compila muito bem com os mesmos argumentos do compilador e é executado sem erros:
#include <mysql.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
MYSQL *sock;
sock = mysql_init(NULL);
mysql_real_connect(sock, NULL, "root", "test", NULL, 0, NULL, 0);
mysql_close(sock);
}
Alguma ideia de onde estou indo errado? A documentação do MySQL para USE_OLD_FUNCTIONS
parece ser inexistente. Eu não posso culpá-los, uma vez que estas funções foram preteridas por um tempo longo , mas o código ainda parece estar lá.
Solução:
Eu acho que descobri. Em vez de editar work/mysql-5.6.16/include/config.h
, eu deveria ter editado work/mysql-5.6.16/include/my_config.h
. Eu adicionei o seguinte ao último arquivo, recompilei o MySQL, e meu programa de teste compila e liga muito bem agora.
#define USE_OLD_FUNCTIONS
Observe que adicionei isso a my_config.h
antes do último #endif
no arquivo. Espero que isso ajude alguém no futuro.