CC=g++
PROJECT=sudoku
SOURCES= solver.cpp
OBJECTS=$(SOURCES:.cpp=.o)
HEADERS_PATH=include
LIBS_PATH=lib -llibz3
all:
g++ -I$(HEADERS_PATH) -L$(LIBS_PATH) $(SOURCES) -o $@
test:
make -f gtest/Makefile
run:
make -f gtest/Makefile run
clean:
rm -rf $(OBJECTS) $(PROJECT)
make -f gtest/Makefile clean
运行 make 后出现以下错误:
g++ -Iinclude -Llib -llibz3 solver.cpp -o all
/usr/bin/ld: cannot find -llibz3
collect2: error: ld returned 1 exit status
Makefile:9: recipe for target 'all' failed
make: *** [all] Error 1
结构是
include
|
|
lib
libz3.lib
|
|
solver.cpp
solver.h
|
|
gtest
写错了什么?
基本错误
传递给链接器时,动态库被指定为不带后缀和不带前缀,或者带有库的路径。在大多数 GNU/Linux 系统上,后缀是
.so,前缀是lib,即 键应该看起来像-lz3或-llib/libz3.so。此外,从名称来看
libz3.lib,它不是 GNU/Linux 动态库。例如,您可以使用实用程序进行检查file。其他错误
CC传统上是 C 编译器;对于 C++ 编译器,您应该使用名称CXX或CPP以这种方式将所有东西混在一起是不好的形式;您应该将库与路径分开,或者为链接器标志创建一个变量:
对于标头的路径,最好也这样做。
编译应该与链接分开,对于 GNU,
make您可以使用通用规则:%.o: %.c $(CXX) -c -I$(HEADERS_PATH) -o $@ $<
并且应该为链接可执行文件的目标指定一个有意义的名称,并指定依赖项:
并且目标
all已经指定了对它的依赖: