ubuntu下编译c程序,undefined reference to

时间:2022-03-19 17:47:25
编译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

19 个解决方案

#1


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)

#2


例子:
Makefile

main: main.cpp
g++ -o $@  $<  -lxxlib

#3


引用 2 楼  的回复:
例子:
Makefile

main: main.cpp
g++ -o $@  $<  -lxxlib

  没有main.cpp啊  是用纯c的

#4


g++ -o main.c -lmysqlclient    就一个文件的话就这样吧, 不用makefile了

#5


引用 4 楼  的回复:
g++ -o main.c -lmysqlclient    就一个文件的话就这样吧, 不用makefile了
  不止一个文件啊。。。。这个文件引用了很多开源的文件。。所以必须用make  。。大神帮帮忙啊

#6


也可以啊!!你包含时用相对路径或绝对路径,   或者 用-I选项 加入你自己的库文件路径
g++ -o main.c -lmysqlclient -I/home/mylib

#7


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

#8


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

这样试一下

#9


引用 8 楼  的回复:
MAMA_LIBS = $(BDYNAMIC) -lmama \
  $(BDYNAMIC) $($(API_PLATFORM)_libs) -lrt -lpthread -lm  -lmysqlclient  

这样试一下
  试过了  木有效果 

#10


报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC  ,makefile还不是用GCC或G++

#11


引用 10 楼  的回复:
报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC  ,makefile还不是用GCC或G++
   还是说undefined reference 什么的。。。 

#12


你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。

#13


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++,具体见前文对于混合编译的说明

#14


  有的啊 确定有的
引用 12 楼  的回复:
你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。

#15


这几个错误原因对于的解决方法有吗?
引用 13 楼  的回复:
undefined reference error错误的原因可能来自以下几方面:

 

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

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

 

2 连接库参数的顺序不对

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

 

3 g……

#16


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  编译一下看还会不会出现找不到实现

#17


再 gcc -o main.c -lmysqlclient 编译一下看还会不会出现找不到实现  这样是可以的。。可以操作数据库。。

 $(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm  但是这样修改后用make -f Makefile.sample 还是不行

#18


那就是说库没问题 ,就是makefile的问题 
MAMA_LIBS = $(BDYNAMIC) -lmama \
  $(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm  

试一下改一下-lmysqlclient 的位置 ,我试过位置不对时会出现这种情况,  ubuntu下编译c程序,undefined reference to
不行我也没办法了,菜鸟一个

#19


等 结果

#1


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)

#2


例子:
Makefile

main: main.cpp
g++ -o $@  $<  -lxxlib

#3


引用 2 楼  的回复:
例子:
Makefile

main: main.cpp
g++ -o $@  $<  -lxxlib

  没有main.cpp啊  是用纯c的

#4


g++ -o main.c -lmysqlclient    就一个文件的话就这样吧, 不用makefile了

#5


引用 4 楼  的回复:
g++ -o main.c -lmysqlclient    就一个文件的话就这样吧, 不用makefile了
  不止一个文件啊。。。。这个文件引用了很多开源的文件。。所以必须用make  。。大神帮帮忙啊

#6


也可以啊!!你包含时用相对路径或绝对路径,   或者 用-I选项 加入你自己的库文件路径
g++ -o main.c -lmysqlclient -I/home/mylib

#7


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

#8


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

这样试一下

#9


引用 8 楼  的回复:
MAMA_LIBS = $(BDYNAMIC) -lmama \
  $(BDYNAMIC) $($(API_PLATFORM)_libs) -lrt -lpthread -lm  -lmysqlclient  

这样试一下
  试过了  木有效果 

#10


报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC  ,makefile还不是用GCC或G++

#11


引用 10 楼  的回复:
报什么错? 编译出错还是链接出错?
不行那就自己写makefile吧!!! 什么叫不能用GCC  ,makefile还不是用GCC或G++
   还是说undefined reference 什么的。。。 

#12


你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。

#13


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++,具体见前文对于混合编译的说明

#14


  有的啊 确定有的
引用 12 楼  的回复:
你确定 相应目录下的lib有相应内容么?我曾经装snmp的时候也会提示lib里东东找不到,而且很多错说找不到。重下了个版本,就ok。

#15


这几个错误原因对于的解决方法有吗?
引用 13 楼  的回复:
undefined reference error错误的原因可能来自以下几方面:

 

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

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

 

2 连接库参数的顺序不对

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

 

3 g……

#16


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  编译一下看还会不会出现找不到实现

#17


再 gcc -o main.c -lmysqlclient 编译一下看还会不会出现找不到实现  这样是可以的。。可以操作数据库。。

 $(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm  但是这样修改后用make -f Makefile.sample 还是不行

#18


那就是说库没问题 ,就是makefile的问题 
MAMA_LIBS = $(BDYNAMIC) -lmama \
  $(BDYNAMIC) $($(API_PLATFORM)_libs) -lmysqlclient -lrt -lpthread -lm  

试一下改一下-lmysqlclient 的位置 ,我试过位置不对时会出现这种情况,  ubuntu下编译c程序,undefined reference to
不行我也没办法了,菜鸟一个

#19


等 结果

#20