十一月 1, 2011

解决 undefined reference to `_uncompress’ `_compress’问题

Written by

在eclipse+CDT+mysql环境下编译项目,出现如下错误:

Building target: dbdeal.dll
Invoking: Cygwin C++ Linker
g++ -L”C:\cygwin\code\trunk\Utility\Debug” -L”C:\cygwin\code\trunk\log\Debug” -L”C:\cygwin\usr\local\lib\mysql” -shared -o”dbdeal.dll” ./LoadSticTable.o ./ParseCommand.o ./SQLQuery.o ./TableModels/TabBase.o ./TableModels/tabAnalysisData.o ./TableModels/tabCmdBuffer.o ./TableModels/tabDevice.o ./TableModels/tabFirmware.o ./TableModels/tabRawData.o ./TableModels/tabUser.o ./TableModels/tabWarningRecord.o -lUtility -llog -lmysqlclient
C:\cygwin\usr\local\lib\mysql/libmysqlclient.a(my_compress.o):my_compress.c:(.text+0x5f): undefined reference to `_uncompress’
C:\cygwin\usr\local\lib\mysql/libmysqlclient.a(my_compress.o):my_compress.c:(.text+0x1aa): undefined reference to `_compress’
collect2: ld returned 1 exit status
make: *** [dbdeal.dll] Error 1

?
网上找了很多关于‘undefined reference to `_uncompress’’的问题,但都很草草的说给gcc添加‘-lz’参数可以解决问题日,但是问为啥,都说不出个所以然来。
很多都是命令行编译,而我用的是eclipse,makefile动态生成,所以去修改makefile是不明智的,只能从配置入手。
在项目上右键—>属性,出现属性对话框,到‘Cygwin C++ Linker’项下的‘Miscellaneous’里的‘Linker flags’输入参数‘ -lz’:

编译看看,发现-lz参数被直接串在了lib库查询路径的后面,而不是mysqlclient的后面:

g++ -L”C:\cygwin\code\trunk\Utility\Debug” -L”C:\cygwin\code\trunk\log\Debug” -L”C:\cygwin\usr\local\lib\mysql” -lz -shared -o”dbdeal.dll”

所以‘-lz’参数对mysqlclient不起作用。
其实在‘Expert settings’中有个‘Command line pattern’的设置:

${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}

其中的‘${FLAGS}’变量就是上面设置‘-lz’参数的‘Linker flags’,解决办法出来了:把 ${FLAGS} 挪到 ${INPUTS} 之后,问题解决:

Category : 其他

Tags :

Comments

3 Responses

  1. 文秘之家说道:

    第一次来 踩踩

  2. 好东家说道:

    学习学习,增加知识

  3. 办公文秘说道:

    喜欢你这 我会经常来

发表评论

电子邮件地址不会被公开。

Proudly powered by WordPress and Sweet Tech Theme