"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 -p
makefile 없이 디렉터리에서 실행하세요.
적어도 내 시스템의 GNU make 버전에는 내장된 대상 규칙이 없는 것 같습니다 *.so
. 공유 객체에 대한 Make의 기본 정의는 다음 과 같으나 기본값 .LIBPATTERNS
은 . 또한 기본 규칙도 없습니다.lib%.so lib%.a
lib*.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.mk
makefile에 추가하십시오.
include my_favorite_recipe.mk
OBJ
목록을 정의하는 것을 잊지 마세요 .