Makefile link 静态库

Makefile link static library

这里只是一个简单的 makefile,但总是 ld: 链接静态库时出错
文件夹树

├── include
│   └──main.h
├── lib
│   └── libmyrand.a
├── main.c
├── main.o
└──  Makefile

  1 TARGET= main
  2 
  3 INC = -Iinclude
  4 
  5 LIBDIR = ./lib
  6 LIB = libmyrand
  7 
  8 OBJS = main.o
  9 
 10 SOURCES = main.c
 11 
 12 
 13 all: $(TARGET)
 14 
 15 $(TARGET): $(OBJS)
 16   gcc -o main  $< -L$(LIBDIR) -l$(LIB)
 17 
 18 $(OBJS):  $(SOURCES)
 19   gcc -c -g $(INC)  $< 
 20 
 21 .PHONY: clean
 22 
 23 clean:
 24   rm -f *.o

生成错误信息:

gcc -c -g -Iinclude  main.c 
gcc -o main -L./lib -llibmyrand main.o 
/usr/bin/ld: cannot find -lmyrand
collect2: error: ld returned 1 exit status
make: *** [Makefile:16: main] Error 1

如果我将#15-#16 行更改为

 15$(TARGET): $(OBJS)
 16   gcc -o main  $< ./lib/libmyrand.a

大功告成! 巴拉巴拉

这不是生成文件问题。这是对编译器和链接器工作方式的误解。如果您在 shell 提示符下键入原始命令,而不是通过 make,那么它将以同样的方式失败。所以,你知道它与 make 没有任何关系。

编译器命令行 -lfoo 选项将始终查找库名称 libfoo.solibfoo.a。所以如果你想使用 -lmyrand,那么你需要将你的库命名为 libmyrand.solibmyrand.a.

.a 是静态库,.so 是共享库,当然,所以如果你使用静态库,你需要 libmyrand.a.