Lỗi Makefile "nhiều mẫu đích"


82

Makefile của tôi không thành công với lỗi:

Makefile:34: *** multiple target patterns.  Stop.

Nó thực sự có nghĩa là gì, làm thế nào tôi có thể sửa lỗi này?

( Hướng dẫn sử dụng GNU , được viết bởi Captain Obvious, không giúp ích gì).


Đã tìm thấy nó. Tôi đã có quy tắc ở dạng:

$(FOO): bar

nơi FOOđược đặt từ lệnh shell đã làm ô nhiễm nó với thông báo lỗi chứa dấu hai chấm.




Những câu trả lời này chỉ là cách diễn giải "bạn có nhiều mẫu mục tiêu". Vâng, tôi nghĩ là tôi không. Làm thế nào tôi có thể kiểm tra nó? Điều gì có thể kích hoạt nó? Cần có những biện pháp phòng ngừa nào để ngăn chặn vấn đề này?
Kornel

2
Mọi thứ đang hoạt động trong một phút và sau đó kịch bản của tôi bị hắt ra một dấu chấm phẩy (dấu chấm phẩy) ... heheh. Đổ mồ hôi khi cố gắng tìm ra vấn đề trong ít nhất 3 giờ trước khi tôi tìm thấy câu trả lời của bạn và @mcr. Bạn vừa tiết kiệm cho tôi một xô mồ hôi !!
GuruM

Nguyên nhân gốc rễ thực sự của vấn đề này là GNU Make trở thành một đống phân khủng khiếp mà lẽ ra đã chết cách đây nhiều thập kỷ.
antred

Câu trả lời:


62

Tôi đã có nó trên Makefile

MAPS+=reverse/db.901:550:2001.ip6.arpa 
lastserial:  ${MAPS}
    ./updateser ${MAPS}

Đó là do :tên tập tin. Tôi đã giải quyết vấn đề này với

                      -------- để ý
                     //
                    vv
MAPS + = reverse / db.901 \: 550 \: 2001.ip6.arpa
sê-ri cuối cùng: $ {MAPS}
    ./updateser $ {MAPS}

1
tôi có cùng một vấn đề, nhưng tôi không hiểu câu trả lời của bạn, bạn sẽ xây dựng này hơn nữa đối với tôi,
Pir Fahim Shah

4
@PirFahimShah Câu trả lời cho biết rằng dấu hai chấm trong tên tệp (db.901: 550: 2001.ip6.arpa) cần phải được thoát. mcr đang thoát khỏi dấu hai chấm bằng cách đặt dấu gạch chéo ngược trước chúng. Theo cách đó, make không giải thích dấu hai chấm như một biểu tượng đặc biệt.
Loduwijk

1
Cảm ơn, nó đã làm việc cho tôi. Tôi đã có một số đường dẫn cửa sổ cũ với dấu hai chấm trong đó ( C:/Qt/5.8/mingw53_32/bin/rcc.exe) trong một trong các quy tắc Makefile. Di chuyển những makefiles autogenerated nếu bạn đang xây dựng trên máy tính Linux
Vadim Kotov

windows make chuyển sang wsl (ubuntu) và gặp lỗi này, make cleantiếp theo là makegiải quyết nó. Dòng sai là_build/nrf52840_xxaa/app_mpu.c.o: ../../../app_mpu.c \
Tyeth

22

Ngoài việc phải thoát khỏi dấu hai chấm như trong câu trả lời ban đầu, tôi đã phát hiện ra rằng nếu thụt đầu dòng bị tắt, bạn có thể gặp phải vấn đề tương tự. Trong một lần makefile, tôi phải thay thế khoảng trắng bằng một tab và điều đó cho phép tôi vượt qua lỗi.


GNU make cũng có thể báo cáo "Không có Quy tắc cho Mục tiêu" trong trường hợp này.
davenpcj

4

Tôi chỉ muốn nói thêm, nếu bạn gặp lỗi này do bạn đang sử dụng các tệp tạo và tự động tạo của Cygwin, bạn có thể sửa nó bằng sed sau,

sed -e 's@\\\([^ ]\)@/\1@g' -e 's@[cC]:@/cygdrive/c@' -i filename.d

Bạn có thể cần thêm nhiều ký tự hơn là chỉ khoảng trắng vào danh sách thoát trong lần thay thế đầu tiên nhưng bạn có ý tưởng. Khái niệm ở đây là / cygdrive / c là bí danh cho c: mà cygwin's make sẽ nhận ra.

Và cũng có thể ném vào

-e 's@^ \+@\t@'

chỉ trong trường hợp bạn vô tình bắt đầu với dấu cách (mặc dù tôi / nghĩ / đây thường sẽ là lỗi "thiếu dấu phân cách").


3

Tôi đã gặp cùng một lỗi. Sau khi đấu tranh, tôi thấy rằng đó là do "Khoảng cách" trong tên thư mục.

Ví dụ :

Trước đó Tên thư mục của tôi là: "Qt Projects"

Sau đó tôi đã đổi nó thành: "QtProjects"

và vấn đề của tôi đã được giải quyết.

Nó rất đơn giản nhưng đôi khi là một vấn đề lớn.


0

Tôi gặp sự cố này (dấu hai chấm trong tên đích) vì tôi có -ntrong GREP_OPTIONSbiến môi trường của mình . Rõ ràng, điều này gây configurera tạo ra Makefilekhông chính xác.


0

IDE của tôi để lại một hỗn hợp các khoảng trắng và tab trong Makefile của tôi.

Đặt Makefile của tôi để chỉ sử dụng các tab đã khắc phục lỗi này cho tôi.


0

Tôi cũng gặp lỗi này (trong STM32CubeIDE dựa trên Eclipse trên Windows).

Sau khi nhấp đúp vào lỗi "nhiều mẫu mục tiêu", nó hiển thị đường dẫn đến một .ldtệp. Nó chỉ ra là một vấn đề "nhân vật bất hợp pháp". Nhân vật vi phạm là (chờ nó): =

Heuristic of the week: chỉ sử dụng [a..z] trong đường dẫn của bạn, vì có nhiều ký tự bất hợp pháp khác </vomit>.

Sổ tay hướng dẫn tạo GNU không ghi rõ điều này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.