darknet yolo make报错,缺少instance-segmenter.o的规则

darknet yolo make报错,缺少instance-segmenter.o的规则

报错原因

Makefile没有识别到对于instance-segmenter.o的编译规则,但其实instance-segmenter.cpp是存在的
darknet/examples
加粗样式

解决办法

手动编译

  1. 手动编译生成输出文件instance-segmenter.o
g++ -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -fPIC -fpermissive -Ofast -DGPU -c ./examples/instance_segmenter.cpp -o obj/instance_segmenter.o

生成成功
在这里插入图片描述

  1. 修改Makefile,跳过自动化流程
    由于Makefile仍执着于自动化生成instance-segmenter.o,实际上其已经手动生成,所以修改Makefile
    在这里插入图片描述
    找到上图这一行,删除instance-segmenter.o
    继续make即可

新问题

由于删除了instance-segmenter.o,导致最终darknet生成会缺少一个依赖

报错信息

g++ -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -fPIC -fpermissive -Ofast -DGPU obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/darknet.o libdarknet.a -o darknet -lm -pthread  -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand -lstdc++  libdarknet.a
/usr/bin/ld: obj/darknet.o: in function `main':
darknet.cpp:(.text.startup+0x3af): undefined reference to `run_isegmenter(int, char**)'
collect2: error: ld returned 1 exit status
make: *** [Makefile:75:darknet] 错误 1

解决办法

手动编译最后一步

g++ -Iinclude/ -Isrc/ -DGPU -I/usr/local/cuda/include/ -Wall -Wno-unused-result -Wno-unknown-pragmas -fPIC -fpermissive -Ofast -DGPU obj/captcha.o obj/lsd.o obj/super.o obj/art.o obj/tag.o obj/cifar.o obj/go.o obj/rnn.o obj/segmenter.o obj/regressor.o obj/classifier.o obj/coco.o obj/yolo.o obj/detector.o obj/nightmare.o obj/instance_segmenter.o obj/darknet.o libdarknet.a -o darknet -lm -pthread  -L/usr/local/cuda/lib64 -lcuda -lcudart -lcublas -lcurand -lstdc++  libdarknet.a

在这里插入图片描述
生成成功在这里插入图片描述

补充

g++编译选项

g++ 是 GNU Compiler Collection 中用于编译 C++ 代码的工具。您可以使用不同的编译选项来控制编译的行为。以下是一些常见的 g++ 编译选项:

-o <output_file>:指定输出文件的名称。
-Wall:启用常见的警告信息。
-Werror:将警告视为错误,导致编译失败。
-std=:指定所使用的 C++ 标准(例如:-std=c++11、-std=c++14、-std=c++17 等)。
-I <include_path>:添加包含文件的搜索路径。
-L <library_path>:添加库文件的搜索路径。
-l:链接特定的库。
-g:生成用于调试的调试信息。
-O:优化级别,其中 可以是 0、1、2、3 或 s。
-pthread:在编译时链接 POSIX 线程库。
-f:启用或禁用特定的编译特性,如 -finline-functions。
以下是一个示例编译命令,使用了一些常见的选项:

g++ -o my_program my_program.cpp -std=c++11 -Wall -Werror -I /path/to/include -L /path/to/libs -lmylib -g -O2 -pthread

在此命令中,my_program.cpp 是您要编译的源文件,-o my_program 指定输出文件名为 my_program,-std=c++11 指定使用 C++11 标准,-Wall -Werror 启用警告并将其视为错误,-I /path/to/include 添加包含文件搜索路径,-L /path/to/libs 添加库文件搜索路径,-lmylib 链接名为 mylib 的库,-g 生成调试信息,-O2 启用优化级别 2,-pthread 链接 POSIX 线程库。

Makefile编译规则

Makefile 是一种用于管理源代码和构建过程的文件。它描述了源代码文件之间的依赖关系以及如何编译和构建项目。一个典型的 Makefile 包含了编译规则、依赖关系以及构建命令。

# 定义编译器和编译选项
CXX = g++
CXXFLAGS = -std=c++11 -Wall

# 定义目标文件和依赖关系
TARGET = my_program
SRCS = main.cpp foo.cpp bar.cpp
OBJS = $(SRCS:.cpp=.o)

# 默认目标
all: $(TARGET)

# 生成可执行文件
$(TARGET): $(OBJS)
	$(CXX) $(CXXFLAGS) -o $@ $(OBJS)

# 生成目标文件
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@

# 清理生成的文件
clean:
	rm -f $(OBJS) $(TARGET)

在这个示例中,Makefile 包含以下几个部分:

定义了编译器 CXX 和编译选项 CXXFLAGS。
定义了目标文件名 TARGET,源文件列表 SRCS,以及目标文件列表 OBJS。
all 是默认目标,它依赖于 $(TARGET)。
$(TARGET) 目标依赖于目标文件列表 $(OBJS),并且生成可执行文件。
使用模式规则生成目标文件,例如将 .cpp 文件编译成 .o 目标文件。
clean 目标用于删除生成的目标文件和可执行文件。

猜你喜欢

转载自blog.csdn.net/qq_38853759/article/details/132516501
今日推荐