"make"에는 공유 객체를 구축하는 암시적인 방법이 있나요?

"make"에는 공유 객체를 구축하는 암시적인 방법이 있나요?

"make"의 암시적 규칙은 다음에서 정의됩니다.https://www.gnu.org/software/make/manual/make.html#toc-Using-Implicit-Rules. 거기에서 공유 객체에 대한 기본 레시피를 찾을 수 없습니다. 공유 객체를 만들 때 기본 레시피가 있나요?

나는 달릴 수 없어

foo: foo.so

"규칙이 존재하지 않습니다"라는 오류 메시지가 나타납니다.

내가 달릴 수 있을 때

foo: foo.o

makefile에 명시적으로 규칙을 추가할 필요가 없습니다(따라서 대상 파일을 빌드하기 위한 암시적인 규칙이 있습니다).

OpenAI는 이것이 공유 객체 구축을 위한 기본 규칙이라고 알려줍니다(그러나 GNU 매뉴얼에서는 확인할 수 없습니다).

$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)

그러나 내가 아는 한 이것은 잘못된 것 같습니다.

답변1

연결한 GNU Make 매뉴얼의 10.1장 바로 다음에,암시적 규칙 사용, 가지다10.2장,내장 규칙 디렉터리. 앤디 달튼(Andy Dalton)은 이렇게 말합니다.

GNU make 버전에서 사용할 수 있는 기본 규칙 및 변수의 전체 목록을 보려면 make -pmakefile 없이 디렉터리에서 실행하세요.

적어도 내 시스템의 GNU make 버전에는 내장된 대상 규칙이 없는 것 같습니다 *.so. 공유 객체에 대한 Make의 기본 정의는 다음 과 같으나 기본값 .LIBPATTERNS은 . 또한 기본 규칙도 없습니다.lib%.so lib%.alib*.so*.so

Makefile 규칙의 기본 구조는 다음과 같습니다.

target: things_to_make_the_target_out_of ...

그래서 당신의

foo: foo.so

기존 공유 개체에서 실행 파일을 만들려고 시도하는 것 같은데, 이는 이상하고 아마도 무의미해 보입니다.

OpenAI의 답변은 의미가 있는 것 같습니다.공유 객체 구축을 위한 Makefile 규칙의 기본 구조. 즉, Makefile을 사용하여 공유 객체를 만들 때 다음과 같이 보이길 원합니다.

libsomething.so: $(OBJS)
        $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJS)

최소한 OBJS 변수는 올바르게 정의되었습니다.

답변2

아니요, 그러한 암묵적인 규칙은 없습니다.

하지만 원한다면 다음과 같이 할 수 있습니다.

# my_favorite_recipe.mk
# list of my default rules

%.so: $(OBJ)
    $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) -shared -o $@ $(OBJ)

그것을 일부에 넣고 /usr/local/include/my_favorite_recipe.mkmakefile에 추가하십시오.

include my_favorite_recipe.mk

OBJ목록을 정의하는 것을 잊지 마세요 .

관련 정보