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.so
或 libfoo.a
。所以如果你想使用 -lmyrand
,那么你需要将你的库命名为 libmyrand.so
或 libmyrand.a
.
.a
是静态库,.so
是共享库,当然,所以如果你使用静态库,你需要 libmyrand.a
.
这里只是一个简单的 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.so
或 libfoo.a
。所以如果你想使用 -lmyrand
,那么你需要将你的库命名为 libmyrand.so
或 libmyrand.a
.
.a
是静态库,.so
是共享库,当然,所以如果你使用静态库,你需要 libmyrand.a
.