文章目录
- darknet yolo make报错,缺少instance-segmenter.o的规则
- 报错原因
- 解决办法
- 新问题
- 解决办法
- 补充
- g++编译选项
- Makefile编译规则
darknet yolo make报错,缺少instance-segmenter.o的规则
报错原因
Makefile没有识别到对于instance-segmenter.o的编译规则,但其实instance-segmenter.cpp是存在的
darknet/examples
解决办法
手动编译
- 手动编译生成输出文件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
生成成功
- 修改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 目标用于删除生成的目标文件和可执行文件。