ubuntu下编译c程序,undefined reference to

zhouxinyubest2 2012-03-29 08:56:41
编译c文件的时候出现这样的错误undefined reference to "mysql_init"
。 现在不是使用gcc编译,不能在命令后面加上-l mysqlclient.是使用的make命令。
make -f Makefile.sample xxxx. 请问如何编辑Makefile.sample来解决这个问题?
问题补充:
main函数大概是这样的
#include "string.h"
#include<stdio.h>
#include<mysql/mysql.h>
MYSQL conn_ptr;
MYSQL_RES * res_ptr;
MYSQL_ROW sqlrow;

int main (int argc, const char** argv)
{
// parseCommandLine (argc, argv);
//mysql
mysql_init(&conn_ptr);
mysql_real_connect(&conn_ptr,"localhost","root","121812","FinanceData",0,NULL,0)
int res = mysql_query(&conn_ptr,"select tpName from Topic");
if(res){printf("select error");}
else {
res_ptr=mysql_use_result(&conn_ptr);
while((sqlrow=mysql_fetch_row(res_ptr))){
gTopic[i] = (char *)malloc(20*sizeof(char));
gTopic[i++] = sqlrow[0];
}
}

mysql_close(&conn_ptr);
}
大概是这样的 函数很长 使用到了其他的开源api,所以要使用make编译 不能使用gcc
...全文
1034 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
那就是说库没问题 ,就是makefile的问题
MAMA_LIBS = $(BDYNAMIC) -lmama \
$(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm

试一下改一下-lmysqlclient 的位置 ,我试过位置不对时会出现这种情况,
不行我也没办法了,菜鸟一个

zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
再 gcc -o main.c -lmysqlclient 编译一下看还会不会出现找不到实现 这样是可以的。。可以操作数据库。。

$(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm 但是这样修改后用make -f Makefile.sample 还是不行
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
MAMA_LIBS = $(BDYNAMIC) -lmama \
$(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm

这样试一下

要不这样
#include<mysql/mysql.h>
MYSQL conn_ptr;
MYSQL_RES * res_ptr;
MYSQL_ROW sqlrow;

int main (int argc, const char** argv)
{
mysql_init(&conn_ptr);

return 0;
}
保存为main.c

再 gcc -o main.c -lmysqlclient 编译一下看还会不会出现找不到实现
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
这几个错误原因对于的解决方法有吗?[Quote=引用 13 楼 的回复:]

undefined reference error错误的原因可能来自以下几方面:



1 没有指定对应的库(.o/.a/.so)

使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,



2 连接库参数的顺序不对

在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态



3 g……
[/Quote]
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
有的啊 确定有的[Quote=引用 12 楼 的回复:]

你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。
[/Quote]
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
undefined reference error错误的原因可能来自以下几方面:



1 没有指定对应的库(.o/.a/.so)

使用了库中定义的实体,但没有指定库(-lXXX)或者没有指定库路径(-LYYY),会导致该错误,



2 连接库参数的顺序不对

在默认情况下,对于-l 使用库的要求是越是基础的库越要写在后面,无论是静态还动态



3 gcc/ld 版本不匹配

gcc/ld的版本的兼容性问题,由于gcc2 到gcc3大版本的兼容性存在问题(其实gcc3.2到3.4也一定程度上存在这样的问题) 当在高版本机器上使用低版本的机器就会导致这样的错误, 这个问题比较常见在32位的环境上, 另外就在32位环境不小心使用了64位的库或者反过来64位环境使用了32位的库.



4 C/C++相互依赖和链接

gcc和g++编译结果的混用需要保证能够extern "C" 两边都可以使用的接口,在我们的64位环境中gcc链接g++的库还需要加上-lstdc++,具体见前文对于混合编译的说明

甘冰 2012-03-29
  • 打赏
  • 举报
回复
你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC ,makefile还不是用GCC或G++
[/Quote] 还是说undefined reference 什么的。。。
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC ,makefile还不是用GCC或G++
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

MAMA_LIBS = $(BDYNAMIC) -lmama \
$(BDYNAMIC) $($(API_PLATFORM)_libs) -lrt -lpthread -lm -lmysqlclient

这样试一下
[/Quote] 试过了 木有效果
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
MAMA_LIBS = $(BDYNAMIC) -lmama \
$(BDYNAMIC) $($(API_PLATFORM)_libs) -lrt -lpthread -lm -lmysqlclient

这样试一下
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

也可以啊!!你包含时用相对路径或绝对路径, 或者 用-I选项 加入你自己的库文件路径
g++ -o main.c -lmysqlclient -I/home/mylib
[/Quote] 这个引用的东西很复制啊 。。 能不能把这句话-lmysqlclient加到Makefile.sample里面? 第二楼我贴出了这个文件
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
也可以啊!!你包含时用相对路径或绝对路径, 或者 用-I选项 加入你自己的库文件路径
g++ -o main.c -lmysqlclient -I/home/mylib
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

g++ -o main.c -lmysqlclient 就一个文件的话就这样吧, 不用makefile了
[/Quote] 不止一个文件啊。。。。这个文件引用了很多开源的文件。。所以必须用make 。。大神帮帮忙啊
lanneret1234 2012-03-29
  • 打赏
  • 举报
回复
g++ -o main.c -lmysqlclient 就一个文件的话就这样吧, 不用makefile了
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

例子:
Makefile

main: main.cpp
g++ -o $@ $< -lxxlib
[/Quote]
没有main.cpp啊 是用纯c的
帅得不敢出门 2012-03-29
  • 打赏
  • 举报
回复
例子:
Makefile

main: main.cpp
g++ -o $@ $< -lxxlib
zhouxinyubest2 2012-03-29
  • 打赏
  • 举报
回复
Makefile.sample文件是这样的:
API_HOME=../../

## Solaris/Forte compiler:
#CXX = CC
#CC = cc
#BSTATIC = -Bstatic
#BDYNAMIC = -Bdynamic

# GNU compiler:
CXX = g++
CC = gcc
BSTATIC = -Xlinker -Bstatic
BDYNAMIC = -Xlinker -Bdynamic

## Solaris system libraries:
#SYS_LIBS = -lsocket -lgen -lnsl -ldl

# Standard defines:
CPPFLAGS = \
-I$(API_HOME)/include
LDFLAGS = -rdynamic \
-L$(API_HOME)/lib

MAMA_LIBS = $(BDYNAMIC) -lmama \
$(BDYNAMIC) $($(API_PLATFORM)_libs) -lrt -lpthread -lm

# Targets:

all: mamalistenc mamainboxc \
mamapublisherc mamasubscriberc \
mamasymbollistsubscriberc \
mamaproxyc mamaio \
mamamultisubscriberc mamaftmemberc

mamalistenc: mamalistenc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamapublisherc: mamapublisherc.o
$(LINK.c) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamasubscriberc: mamasubscriberc.o
$(LINK.c) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamainboxc: mamainboxc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamaio: mamaio.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamamultisubscriberc: mamamultisubscriberc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamaproxyc: mamaproxyc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamasymbollistsubscriberc: mamasymbollistsubscriberc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)

mamaftmemberc: mamaftmemberc.o
$(LINK.C) -o $@ $^ $(MAMA_LIBS) $(SYS_LIBS)
甘冰 2012-03-29
  • 打赏
  • 举报
回复
等 结果
opencv2.4.4移植到ARM 一、编译环境及库文件 linux环境:ubuntu 11.10 交叉编译:4.6.1 opencv: opencv-2.4.4 cmake: cmake-2.8.1-Linux-i386.tar.gz 二、opencv-2.4.4的移植过程 解压cmake-2.8.1-Linux-i386.tar.gz到/usr/local/ cmake-2.8.1 #export PATH= /usr/local/ cmake-2.8.1/bin:$PATH 用到的主要目录说明: 交叉编译工具链所在目录 /usr/local/arm-4.6.1/ 安装opencv的目录 /usr/local/ opencv源码所在目录 /usr/local /opencv-2.4.4 编译好的opencv库所在目录 /usr/local /opencv-2.4.4/build 默认安装目录为/usr/local #mkdir build #cd build #cmake-gui 选择源代码目录 /usr/local /opencv-2.4.4 选择Build目录 /usr/local /opencv-2.4.4/build 点击Configure,保持generator为Unix Makefiles,选择Specify options for cross-compiling,点击Next, Operating System填写arm-linux C Compilers填写/usr/local/arm-4.6.1//bin/arm-none-linux-gnueabi-gcc C++ Compilers填写/usr/local/arm-4.6.1//bin/ arm-none-linux-gnueabi -g++ 程序库的Target Root填写/usr/local/arm-4.6.1/ 然后点击Finish,开始configure 点击Generate生成Makefile(等configure完之后按钮才能点击) #make 错误一: Linking CXX executable ../../bin/opencv_createsamples ../../lib/libopencv_core.so: undefined reference to `clock_gettime' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc' ../../lib/libopencv_core.so: undefined reference to `pthread_key_create 解决方法: 修改CMakeCache.txt,CMAKE_EXE_LINKER_FLAGS原来为空,加上-lpthread -lrt,重新编译,错误消除 错误二: Linking CXX executable ../../bin/opencv_createsamples ../../lib/libopencv_highgui.so: undefined reference to `_TIFFerrorHandler' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFrealloc' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFmalloc' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcpy' ../../lib/libopencv_highgui.so: undefined reference to `TIFFOpen' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFfree' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFwarningHandler' ../../lib/libopencv_highgui.so: undefined reference to `_TIFFmemcmp' ../../lib/libopencv_high

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧