나는 달리려고 노력하고있다.파일 생성,그림과 같이이 창고, 이는 간단한 Wayland 클라이언트입니다. 하지만 내가 달릴 때만들다, 출력이 비어 있는 것처럼 보이고 $(WAYLAND)
필요한 콘텐츠를 찾을 수 없기 때문에 컴파일되지 않습니다.Wayland-client.h헤드 파일. Fedora 23의 bash에서 cc(GCC) 버전 5.3.1.
다음은 몇 가지 세부정보입니다. 내 질문은 이것이 가능하지 못하게하는 내 환경에 어떤 문제가 있습니까?파일 생성예상대로 작동합니까?
콘텐츠파일 생성:
WAYLAND=`pkg-config wayland-client --cflags --libs`
CFLAGS?=-std=c11 -Wall -Werror -O3 -fvisibility=hidden
hello_wayland: hello_wayland.o helpers.o helpers.h images.bin
$(CC) -o hello_wayland *.o $(WAYLAND) -lrt
images.bin: images/convert.py images/window.png images/fish.png
images/convert.py
cat window.bin fish.bin > images.bin
clean:
$(RM) *.o fish.bin window.bin hello_wayland
산출만들다:
cc -std=c11 -Wall -Werror -O3 -fvisibility=hidden -c -o hello_wayland.o hello_wayland.c hello_wayland.c:6:28: 치명적인 오류: wayland-client.h: 해당 파일 또는 디렉터리가 없습니다.
옵션이 어떻게 되는지 참고하세요CC$(WAYLAND)
위의 내용 에 지정된 출력이 누락된 것 같습니다.파일 생성. 제가 수동으로 하면CC이와 같이:
cc -std=c11 -Wall -Werror -O3 -fvisibility=hidden -c -o hello_wayland.o hello_wayland.c \
-I/home/me/install/include -L/home/me/install/lib -lwayland-client
컴파일에 성공했습니다.
산출pkg-config wayland-client --cflags --libs:
-I/home/me/install/include -L/home/me/install/lib -lwayland-client
콘텐츠~/.bash_profile:
source ~/.profile
source ~/.bashrc
관련 정보~/.bashrc:
export WLD=$HOME/install
export LD_LIBRARY_PATH=$WLD/lib
export PKG_CONFIG_PATH=$WLD/lib/pkgconfig/:$WLD/share/pkgconfig/
export PATH=$WLD/bin:$PATH
export ACLOCAL_PATH=$WLD/share/aclocal
export ACLOCAL="aclocal -I $ACLOCAL_PATH"
나에게는 완전히 명백했을 수도 있는 내용을 지적해 주셔서 감사합니다.
답변1
게시된 메이크파일에 일부 세부정보가 부족합니다.
참고: 컴파일 단계와 연결 단계를 분리하는 것이 (거의) 항상 더 좋습니다.
다음 makefile은 이러한 세부 사항을 수정합니다.
참고: <tab>
실제 makefile에서 탭 키를 사용하는 것을 의미합니다.
RM := /usr/bin/rm
LFLAGS += `pkg-config wayland-client --libs`
CFLAGS := -std=c11 -Wall -Werror -O3 -fvisibility=hidden
CFLAGS += `pkg-config wayland-client --cflags`
OBJS := hello_wayland.o helpers.o
HDRS := helpers.h
TARGET := hello_wayland
.PHONY: all
all: $(TARGET)
$(TARGET): $(OBJS) images.bin
<tab>$(CC) -o hello_wayland *.o $(LFLAGS) -lrt
%.o:%.c $(HDRS)
<tab>$(CC) $(CFLAGS)-c $< -o $@ -I.
images.bin: images/convert.py images/window.png images/fish.png
<tab>images/convert.py
<tab>cat window.bin fish.bin > images.bin
.PHONY: clean
clean:
<tab>$(RM) *.o fish.bin window.bin hello_wayland
원래 makefile에 어떤 문제가 있는지 묻습니다.
다음은 몇 가지 관찰 사항입니다.
make 파일에는 두 가지 유형의 매크로가 있습니다.
- 사용을 위해 한 번만 평가됩니다.
:=
- 참조될 때마다 평가되는 내용
=
규칙에
WAYLAND =`pkg-config wayland-client --cflags --libs`
WAYLAND
각 인용은 재평가됩니다.
CFLAGS ?= -std=c11 -Wall -Werror -O3 -fvisibility=hidden
매크로 형식이 잘못되었습니다. ?=
~해야 한다:=
에서는 Makefile
일반적인 사용법이 있지만 make all
이 makefile에는 해당 대상이 누락되어 있습니다(첫 번째 대상이어야 하므로 make
자체적으로 첫 번째 대상을 실행함). targets
링크 단계는 실제 파일 이름이 아니라 매크로 이름이어야 하기 때문입니다. 매크로에 대상 이름이 포함되어 있습니다.
또한 이러한 매크로를 사용하면 호출 시 생성된 실행 파일 이름을 쉽게 설정할 수 있으며, make
두 가지 접근 방식 모두 작동하지만 유연성을 위해 매크로를 만드는 것이 더 좋습니다.
이는 재귀 makefile이나 여러 개의 다른 실행 파일을 작성할 때 특히 그렇습니다.
hello_wayland: hello_wayland.o helpers.o helpers.h images.bin
이는 특정 헤더 파일에 대해 아무것도 모르는 기본 레시피를 사용하는 숨겨진 컴파일이 있는 링크 단계이므로 헤더 파일이 변경되면 숨겨진 컴파일이 완료되지 않으며 헤더 파일은 helpers.h
링크 단계에 있어서는 안 됩니다.
$(CC) -o hello_wayland *.o $(WAYLAND) -lrt
이것은 makefile에서 사용해서는 안되는 작업이지만 make 도구와 함께 사용하면 됩니다 *.o
.glob
SRC := $(wildcard *.c)
OBJ := $(SRC:.c=.o)
"대상"이 올바르게 참조되며, 사용하면 $@
키 입력 오류가 발생하지 않습니다.$@
images.bin: images/convert.py images/window.png images/fish.png
images/convert.py
cat window.bin fish.bin > images.bin
target
a가 생성된 파일의 이름이 아닌 경우 , 특히 이전 버전에서는 make
대상 앞에 다음이 와야 합니다..PHONY:
.PHONY: <list of target names that produce no actual output file>
clean:
$(RM) *.o fish.bin window.bin hello_wayland
makefiles에서 작업(예:)을 사용하는 glob
것은 좋지 않습니다 . 대신 위에 나열된 것과 *.o
같은 적절한 매크로를 사용하세요.$(OBJS)
그렇다면 원래 makefile이 작동하지 않는 이유는 무엇입니까? 누적적으로 실패로 이어지는 것들의 조합. 더 확실한 이유는 다음과 같습니다.
1) the incorrect setting of the CFLAGS macro
2) the combining of the link operation with the compile operations
3) the missing .PHONY: statement
4) the use of the `glob` statements