She*_*enj 9 c makefile gnu-make
我正在尝试编译此工具.下面是Makefile的开头:
CC = gcc
CFLAGS = -Wall -O2 -D TRACES
DFLAGS = -g -Wall -o0
CPPFLAGS= $(INCLUDES:%=-I %)
LDFLAGS = $(LIBRARIES:%=-L %)
LDLIBS = $(USED_TOOLS:%=-l%)
MY_FILES =
INCLUDE_DIR = ~/include
TOOLBOX_INC = $(INCLUDE_DIR)/tools
TOOLBOX_LIB = $(TOOLBOX_INC)
USED_TOOLS = std_io stringutils
INCLUDES = $(TOOLBOX_INC)
LIBRARIES = $(TOOLBOX_LIB)
Run Code Online (Sandbox Code Playgroud)
我还有〜/ include/tools,编译后包括std_io.o,libstd_io.a,stringutils.o和libstringutils.a
我收到以下错误:
gcc -L ~/include/tools rank.o counterexample.o -lstd_io -lstringutils -o rank
ld: library not found for -lstd_io
collect2: ld returned 1 exit status
make: *** [rank] Error 1
Run Code Online (Sandbox Code Playgroud)
我不确定是否包含正确的内容,以及为什么找不到库文件.
编辑:结果我不小心在-L和-I选项之间留下了空格.此外,我想这些路径必须扩展.它现在正在工作,谢谢!
Jen*_*ens 15
问题是使用代字号来表示"主目录".只有当波形符号是单词中第一个不带引号的字符时,shell才会进行波形扩展.Makefiles永远不会做波浪扩展.因此,在
gcc -L~/include ...
Run Code Online (Sandbox Code Playgroud)
shell 不执行波浪扩展,gcc将在当前目录中查找名为"〜/ include"的目录.但在
gcc -L ~/include ...
Run Code Online (Sandbox Code Playgroud)
壳并执行波浪线扩展和gcc看到
gcc -L /usr/username/include ...
Run Code Online (Sandbox Code Playgroud)
相反,它按预期工作.正确的做法是永远不要对主目录使用代字号扩展,而只需在Makefile中正确使用$ HOME,例如
INCLUDE_DIR = $$HOME/include
Run Code Online (Sandbox Code Playgroud)