GNU链接和编译

时间:2014-05-07 07:02:38

标签: c makefile static-libraries gnu static-linking

所以我正在尝试创建一个必须链接到其他库的源文件库。我的make文件看起来像

CC=gcc
CFLAGS=-Wall -g -static -std=c99 -I "./include/ImageMagick-6/"
MAGICKLIB=-Llib -lMagickWand-6.Q16 -lMagickCore-6.Q16
INCLUDE=-lfreetype -ljpeg -lfontconfig -lXext -lSM -lICE -lX11 -lXt -lbz2 -lz -lm -lpng -lgomp -lpthread -lltdl
LINK=$(INCLUDE) $(MAGICKLIB)
COMMON=setUp.o closeOut.o readImage.o writeImage.o edgeEnhance.o resizeImage.o

lib: $(COMMON)
        ar -cvq libmyip.a $(COMMON)

setUp.o: setUp.c myip.h
        $(CC) $(CFLAGS) -c setUp.c $(LINK)

closeOut.o: closeOut.c myip.h
        $(CC) $(CFLAGS) -c closeOut.c $(LINK)

readImage.o: readImage.c myip.h
        $(CC) $(CFLAGS) -c readImage.c $(LINK)

writeImage.o: writeImage.c myip.h
        $(CC) $(CFLAGS) -c writeImage.c $(LINK)

edgeEnhance.o: edgeEnhance.c myip.h
        $(CC) $(CFLAGS) -c edgeEnhance.c $(LINK)

resizeImage.o: resizeImage.c myip.h
        $(CC) $(CFLAGS) -c resizeImage.c $(LINK)

myIPTest.o: myIPTest.c myip.h
        $(CC) $(CFLAGS) -c myIPTest.c $(LINK)

myIPTest: myIPTest.o myip.h libmyip.a
        $(CC) $(CFLAGS) -o myIPTest myIPTest.o -Llib -lmyip

正在运行make我没有错误/警告。当我运行make myIPTest时,我得到了无法识别的引用。我想这可能是因为.o目标(setUp.o等)没有正确链接.c文件?我不确定。我是一个菜鸟,我一直在互联网上搜索几个小时,我似乎无法修复它。你们中的任何人都有任何想法吗?

FIXED:从我的.o目标中删除了所有$(LINK),并将其放在myIPTest目标的末尾,然后就可以了。

2 个答案:

答案 0 :(得分:2)

使用-c选项将源文件编译为目标文件时,所有-lsomelibrary选项都无用。这些选项仅在编译器将目标文件链接到可执行文件时才有效。

换句话说,$(LINK)应该添加到makefile中的最后一个操作行(构建myIPTest的那个);在所有其他方面,它没用。

答案 1 :(得分:0)

-Llib指示链接器在libmyip.a目录中查找lib。另一方面,lib规则在当前目录中创建libmyip.a。将-Llib替换为-L.,看看会发生什么。

PS:makefile的其余部分也需要一些重构。