mysql 과 c 연동시, gcc 이용해 컴파일하면 에러가 발생합니다.(unix환경)
사용한 mysql 서버 버젼 : 4.0.26-standard
c 프로그램에서 mysql DB 를 호출하는 코드를 수행하려고 하는데요...
인터넷에서 구한 다음과 같은 소스를 실행하고자 합니다.
=============================================
#include
#include
#include
#define DB_HOST "127.0.0.1"
#define DB_USER "----"
#define DB_PASS "----"
#define DB_NAME "test"
#define CHOP(x) x[strlen(x) - 1] = ' '
int main(void)
{
MYSQL *connection=NULL, conn;
MYSQL_RES *sql_result;
MYSQL_ROW sql_row;
int query_stat;
char name[12];
char address[80];
char tel[12];
char query[255];
mysql_init(&conn);
connection = mysql_real_connect(&conn, DB_HOST,
DB_USER, DB_PASS,
DB_NAME, 3306,
(char *)NULL, 0);
if (connection == NULL)
{
fprintf(stderr, "Mysql connection error : %s", mysql_error(&conn));
return 1;
}
query_stat = mysql_query(connection, "select * from address");
if (query_stat != 0)
{
fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
return 1;
}
sql_result = mysql_store_result(connection);
printf("%+11s %-30s %-10s", "이름", "주소", "전화번호");
while ( (sql_row = mysql_fetch_row(sql_result)) != NULL )
{
printf("%+11s %-30s %-10s", sql_row[0], sql_row[1], sql_row[2]);
}
mysql_free_result(sql_result);
printf("이름 :");
fgets(name, 12, stdin);
CHOP(name);
printf("주소 :");
fgets(address, 80, stdin);
CHOP(address);
printf("전화 :");
fgets(tel, 12, stdin);
CHOP(tel);
sprintf(query, "insert into address values "
"('%s', '%s', '%s')",
name, address, tel);
query_stat = mysql_query(connection, query);
if (query_stat != 0)
{
fprintf(stderr, "Mysql query error : %s", mysql_error(&conn));
return 1;
}
mysql_close(connection);
}
========================================
위의 파일을 mysql_test.c 란 이름으로 저장했습니다.
그 후 아래와 같이 컴파일을 했습니다.
(/usr/local/mysql/include 와 /usr/local/mysql/lib 는 각각 mysql 의 인클루드 파일과 라이브러리가 저장돼 있는 경로)
gcc -o mysql_test mysql_test.c -I/usr/local/mysql/include
-L/usr/local/mysql/lib -lmysqlclient
그랬더니 아래 그림과 같은 에러가 발생하네요..
mysql 이랑 C 랑 처음 연동해 보는거라... 저는 뭐가 잘못된 건지 잘 모르겠네요..
어떻게 해야하죠?
좋은 하루 보내세요..^^
첨부 | 파일 크기 |
---|---|
mysql에러.JPG | 61.23 KB |
...
위와 같은 문제가 발생하면.. 주로 nm 유틸리티를 사용해서.. 빠진 라이브러리를
찾아서... 컴파일시 넣어주기만 하면 되는데요!!!
근뎅... 추가되어있을법한 녀석들만 나열되어있으니..
connect나 floor 등.... 이 녀석들이 빠진걸 보면...
이 녀석들의 위치를 정확히 지정(컴파일시)해 주시거나 혹은 ld.conf(기억이 안남)
라이브러리의 경로를 추가 해주면 될것같습니다..
******참고******
nm * | grep 찾고자하는 이름
#define DEBUG printf( "%s, %s, %d\n", __FILE__, __FUNCTION__, __LINE__ );
정적 라이브러리
정적 라이브러리 참조를 시도하는군요.. 동적 라이브러리가 있는지 확인해보시면 될거 같습니다.
만약 없다면 정적 라이브러리로 컴파일 하실꺼면 기억으론 -static 옵션을 주셔야 할겁니다.. (아닐수도 있어요.. ^^)
현재 -L 옵션으로 지정해줬기 때문에 큰 상관없을거 같습니다. 또한 라이브러리 PATH 관련 파일은 /etc/ld.so.conf에 지정하시면 됩니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
소켓 관련
소켓 관련 라이브러리를 추가해 보세요. 어떤 라이브러리가 필요한지는 MySQL 매뉴얼에 나와있을 겁니다.
문제 해결했습니다...^
댓글 달아주신 분들 감사합니다^^
mysql 사이트 가서 뒤져보니, 답이 나오네요..^^;;
출처 : http://dev.mysql.com/doc/refman/4.1/en/c-api-linking-problems.html
17.2.13.4. Problems Linking with the C API
When linking with the C API, the following errors may occur on some systems:
gcc -g -o client test.o -L/usr/local/lib/mysql -lmysqlclient -lsocket -lnsl
Undefined first referenced symbol in file floor /usr/local/lib/mysql/libmysqlclient.a(password.o)
ld: fatal: Symbol referencing errors. No output written to client
If this happens on your system, you must include the math library by adding -lm to the end of the compile/link line.
댓글 달기