未定义引用X,尽管库按正确顺序链接

时间:2013-02-18 16:23:27

标签: c++ linker undefined

我知道这些线程已经有很多,但似乎没有一个适用于这个问题。

我有两个项目,每个项目都使用我的道奇库。一个是使用该库的大部分功能的相当大的项目;另一个是小型演示。每个项目的make文件都是相同的,但是小的demo无法链接,并出现以下错误:

../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_read_ihdr':
(.text+0x3bc): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_read_ihdr':
(.text+0x3d9): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_ihdr':
(.text+0x5b9): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_ihdr':
(.text+0x5d6): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_init_deflate':
(.text+0x9b1): undefined reference to `deflateInit_'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_init_inflate':
(.text+0xa43): undefined reference to `inflateInit_'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_end_deflate':
(.text+0xa9c): undefined reference to `deflateEnd'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_end_inflate':
(.text+0xae0): undefined reference to `inflateEnd'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_inflate':
(.text+0xb5f): undefined reference to `inflate'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_deflate':
(.text+0xbe6): undefined reference to `deflate'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_idats':
(.text+0xcb0): undefined reference to `compress'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_idats':
(.text+0xccc): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_idats':
(.text+0xceb): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_write_idats':
(.text+0xd9d): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_read_idat':
(.text+0xe86): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o): In function `png_read_idat':
(.text+0xea5): undefined reference to `crc32'
../Dodge/Dodge/lib/libpnglite.a(pnglite.o):(.text+0xec1): more undefined references to `crc32' follow

引用是指libz。我曾经用以下命令链接二进制文件:

g++ ./main.o -o demo -L../Dodge/Dodge/lib -L/usr/lib -lDodge -lX11 -lGLESv2 -lEGL -lpnglite -lz -lBox2D `sdl-config --libs` -lSDLmain -lSDL -lSDL_mixer

正如你所看到的,-lz来自-lpnglite。静态库libz.a和libpnglite.a位于../Dodge/Dodge/lib中。我试过玩这个命令无济于事。

如果我从代码中删除了以下行,则它会成功链接。奇怪的是,大型项目中存在相同的行,没有遇到任何问题。

   tex0 = pTexture_t(new Texture(node));

Texture的构造函数使用pnglite,并且未声明内联fyi(如果相关)。

有没有人知道这里可能会发生什么?我多年来一直在使用C ++,这是我多年来第一次被链接器错误所困扰。

以下是两个make文件:

DODGE_LOCATION = ../Dodge

NAME = platformer
CC = g++
CFLAGS = -std=c++0x -O3 -Wall `sdl-config --cflags` -DLINUX -g -DDEBUG
INCL = -I$(DODGE_LOCATION)/Dodge/include
LIBS = -L$(DODGE_LOCATION)/Dodge/lib -L/usr/lib -lDodge -lX11 -lGLESv2 -lEGL -lpnglite -lz -lBox2D `sdl-config --libs` -lSDLmain -lSDL -lSDL_mixer
SRC = src
OBJS = $(SRC)/Application.o \
    $(SRC)/Item.o \
    $(SRC)/GameLogic.o \
    $(SRC)/GameSettings.o \
    $(SRC)/main.o \
    $(SRC)/Menu.o \
    $(SRC)/MenuItem.o \
    $(SRC)/Player.o \
    $(SRC)/SoundFx.o \
    $(SRC)/StartMenu.o

all: $(OBJS)
    $(CC) $(OBJS) -o $(NAME) $(LIBS)

$(OBJS): %.o: %.cpp
    $(CC) -c $(CFLAGS) $(INCL) $< -o $@

clean:
    rm -f $(SRC)/*.o

和未链接的那个:

DODGE_LOCATION = ../Dodge

NAME = demo
CC = g++
CFLAGS = -std=c++0x -O3 -Wall `sdl-config --cflags` -DLINUX -g -DDEBUG
INCL = -I$(DODGE_LOCATION)/Dodge/include
LIBS = -L$(DODGE_LOCATION)/Dodge/lib -L/usr/lib -lDodge -lX11 -lGLESv2 -lEGL -lpnglite -lz -lBox2D `sdl-config --libs` -lSDLmain -lSDL -lSDL_mixer
SRC = .
OBJS = $(SRC)/main.o

all: $(OBJS)
    $(CC) $(OBJS) -o $(NAME) $(LIBS)

$(OBJS): %.o: %.cpp
    $(CC) -c $(CFLAGS) $(INCL) $< -o $@

clean:
    rm -f $(SRC)/*.o

这两个项目位于目录树的同一级别,您可以看到make文件是相同的。我从同一个终端运行make实用程序(只需cd到项目目录),这意味着环境变量也是相同的。我想不出可能区分这两个项目的任何其他因素。正如我所说,失败的项目中的违规行也存在于成功的项目中。我错过了一些明显的东西吗?

提前致谢

0 个答案:

没有答案