我有一个src
文件夹,在运行make
后,会以.a
格式创建4个库。
还有一个文件夹tests
,其中包含tests.cpp
。此文件取决于前面提到的库。
我正在尝试在tests
内部生成一个Makefile,在src
内生成库(这样做),然后使用它们来编译tests.cpp
(这不是 - 我得到了许多未定义的引用,就好像它没有正确链接一样。)
文件夹tests
包含此Makefile
:
include ../src/makefile.inc
DIR = ../src
OBJLIBS = ../src/CapaFisica.a ../src/CapaLogica.a ../src/CapaInterfaz.a ../src/Utilitarios.a
TARGETS = tests.cpp
EXE = tests
all : $(EXE)
%.a :
-for d in $(DIR); do (cd $$d; $(MAKE)); done
tests: $(OBJLIBS)
$(CC) $(CFLAGS) $(OBJLIBS) -o $@ $(TARGETS)
clean :
$(ECHO) Borrando archivos.
-$(RM) -f ./tests
cd $(DIR); make clean
find . -name "*.o" -type f -print | xargs /bin/rm -f
我做错了什么?
答案 0 :(得分:2)
gcc链接器对命令行中指定的.o文件和静态库的顺序很敏感。
更换
$(CC) $(CFLAGS) $(OBJLIBS) -o $@ $(TARGETS)
与
$(CC) $(CFLAGS) -o $@ $(TARGETS) $(OBJLIBS)
可能有所帮助。如果$(OBJLIBS)
中的.a文件彼此依赖,也要确保它们的顺序正确。依赖库必须位于定义符号的库之前的命令行上。
有关详细信息,请参阅此问题:Why does the order in which libraries are linked sometimes cause errors in GCC?