pkg-config 출력이 makefile에서 작동하지 않습니까?

pkg-config 출력이 makefile에서 작동하지 않습니까?

나는 달리려고 노력하고있다.파일 생성,그림과 같이이 창고, 이는 간단한 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

targeta가 생성된 파일의 이름이 아닌 경우 , 특히 이전 버전에서는 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

관련 정보