关于在ubuntu11.10和12.04上luagd库编译通不过的情况

95 views
Skip to first unread message

Tang Daogang

unread,
Apr 20, 2012, 11:41:53 PM4/20/12
to bamb...@googlegroups.com, fen...@legerobot.com
去年就发现这个问题了,一直没去解决。现在12.04要出来了,这是长期支持版本,所以就花时间研究了下。

问题如下所示:

daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ ls
COPYING  debian  demos  doc  gd.o  gd.so  luagd.c  lua-gd.spec  Makefile  Makefile~  README  test_features.lua
daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ lua -lgd
lua: error loading module 'gd' from file './gd.so':
./gd.so: undefined symbol: gdImageSquareToCircle
stack traceback:
[C]: ?
[C]: ?
[C]: ?

一点一点对lua-gd中的编译选项进行了研究,记录如下:

gcc -o gd.so `gdlib-config --features |sed -e "s/GD_/-DGD_/g"` `gdlib-config --cflags` `pkg-config lua5.1 --cflags` -O -Wall -fPIC -shared `gdlib-config --ldflags` `gdlib-config --libs` `pkg-config lua5.1 --libs` -lgd luagd.c -fPIC

gcc -c luagd.c -o gd.o `gdlib-config --features |sed -e "s/GD_/-DGD_/g"` `gdlib-config --cflags` `pkg-config lua5.1 --cflags` 

-------
gdlib-config --features |sed -e "s/GD_/-DGD_/g"
-DGD_XPM -DGD_JPEG -DGD_FONTCONFIG -DGD_FREETYPE -DGD_PNG -DGD_GIF -DGD_GIFANIM -DGD_OPENPOLYGON

-------
gdlib-config --cflags
-I/usr/include

--------
pkg-config lua5.1 --cflags
-I/usr/include/lua5.1 


gcc -shared -o gd.so `gdlib-config --ldflags` `gdlib-config --libs` `pkg-config lua5.1 --libs` -lgd gd.o

---------
gdlib-config --ldflags
-L/usr/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -Wl,-Bsymbolic-functions -Wl,-z,relro

---------
gdlib-config --libs
-lXpm -lX11 -ljpeg -lfontconfig -lfreetype -lpng12 -lz -lm

----------
pkg-config lua5.1 --libs
-llua5.1  



把编译参数展开后,分如下两步走:

gcc -c luagd.c -DGD_XPM -DGD_JPEG -DGD_FONTCONFIG -DGD_FREETYPE -DGD_PNG -DGD_GIF -DGD_GIFANIM -DGD_OPENPOLYGON -I/usr/include -I/usr/include/lua5.1 -fPIC -o gd.o

gcc -shared -o gd.so gd.o -lgd -llua5.1

发现,可以了。其实主要是ld阶段的参数过多问题。

并且发现,新版本的gcc,对参数的顺序也有讲究。比如下面的两个,就是ld的时候换了一下位置而已,可是一个编译不过,一个编译通过。

daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ make
gcc `gdlib-config --features |sed -e "s/GD_/-DGD_/g"` `gdlib-config --cflags` `pkg-config lua5.1 --cflags` -fPIC -c luagd.c -o gd.o
gcc -shared -lgd -llua5.1 -o gd.so gd.o
lua test_features.lua
lua: error loading module 'gd' from file './gd.so':
./gd.so: undefined symbol: gdImageSquareToCircle
stack traceback:
[C]: ?
[C]: in function 'require'
test_features.lua:5: in main chunk
[C]: ?
make: *** [gd.so] 错误 1
daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ make clean
rm -f gd.so *.o
daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ make
gcc `gdlib-config --features |sed -e "s/GD_/-DGD_/g"` `gdlib-config --cflags` `pkg-config lua5.1 --cflags` -fPIC -c luagd.c -o gd.o
gcc -o gd.so gd.o -shared -lgd -llua5.1 
lua test_features.lua
Lua-GD version: lua-gd 2.0.33r2
Lua-GD features:
    PNG support ..................... Enabled
    GIF support ..................... Enabled
    JPEG support .................... Enabled
    XPM/XBM support ................. Enabled
    FreeType support ................ Enabled
    Fontconfig support .............. Enabled
daogang@bamboo:~/Packages/bamboo_installer/lua-gd-2.0.33r2$ 

结论是,附加选项参数要写到后面


晕,附上修改后的Makefile文件。

------------------------------------------------------------------

# luagd -- gd bindings for the Lua Programming Language.
# (c) 2004-06 Alexandre Erwin Ittner <ait...@netuno.com.br>
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
# IN NO EVENT SHALL THE AUTHOR OR COPYRIGHT HOLDER BE LIABLE FOR ANY
# CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# If you use this package in a product, an acknowledgment in the product
# documentation would be greatly appreciated (but it is not required).
#

CC=gcc

# ---------------------------------------------------------------------------
# Automatic configuration using pkgconfig, gd-config and sed. These
# lines should work on most Linux/Unix systems. If your system does not
# have these programs you must comment out these lines and uncomment and
# change the next ones.

# Name of .pc file. "lua5.1" on Debian/Ubuntu
LUAPKG=lua5.1
OUTFILE=gd.so
CFLAGS=`gdlib-config --cflags` `pkg-config $(LUAPKG) --cflags` -O2 -Wall -fPIC
GDFEATURES=`gdlib-config --features |sed -e "s/GD_/-DGD_/g"`
#LFLAGS=-shared `gdlib-config --ldflags` `gdlib-config --libs` \
#    `pkg-config $(LUAPKG) --libs` -lgd
LFLAGS=-shared -lgd -llua5.1

INSTALL_PATH=`pkg-config $(LUAPKG) --variable=INSTALL_CMOD`


# ---------------------------------------------------------------------------
# Manual configuration for systems without pkgconfig.

#OUTFILE=gd.so
#CFLAGS=-Wall `gdlib-config --cflags` -I/usr/include/lua5.1 -O3
#GDFEATURES=`gdlib-config --features |sed -e "s/GD_/-DGD_/g"`
#LFLAGS=-shared `gdlib-config --ldflags` `gdlib-config --libs` -llua51 -lgd
#INSTALL_PATH=/usr/lib/lua/


# ---------------------------------------------------------------------------
# Manual configuration for Windows and systems without sed, pkgconfig, etc.
# Uncomment, change and good luck :)

#OUTFILE=gd.dll
#CFLAGS=-Wall -IC:/lua5.1/ -O3
#GDFEATURES=-DGD_XPM -DGD_JPEG -DGD_FONTCONFIG -DGD_FREETYPE -DGD_PNG -DGD_GIF
#LFLAGS=-shared -lgd2 -lm -llua51
#INSTALL_PATH="C:/Program Files/lua/"
# ---------------------------------------------------------------------------


all: $(OUTFILE)

$(OUTFILE): luagd.c
# $(CC) -o $(OUTFILE) $(GDFEATURES) $(CFLAGS) $(LFLAGS) luagd.c
$(CC) $(GDFEATURES) $(CFLAGS) -c luagd.c -o gd.o
$(CC) -o $(OUTFILE) gd.o $(LFLAGS) 
lua test_features.lua

install: $(OUTFILE)
install -s $(OUTFILE) $(INSTALL_PATH)

clean:
rm -f $(OUTFILE) *.o



------------------------------------------------------------------



--
Nothing is impossible.

Reply all
Reply to author
Forward
0 new messages