长话短说,这个库https://github.com/tum-vision/fastms有一个makefile,用于c编译为mac和linux的matlab文件,我试图将它重新用于cygwin .
请在这个单个makefile上度过一个星期后,我非常渴望得到这个 .
这是我当前迭代中的make文件
all: targets
USE_CUDA:=0
USE_OPENMP:=1
USE_OPENCV:=0
USE_MEX:=1
TMP_DIR:=tmp
LIBS:=
DEFINES:=
INCLUDES:=
TARGETS:=
SOLVER_SOURCE_DIR:=src/libfastms
INCLUDES += -I$(SOLVER_SOURCE_DIR)
# c++
GXX:=x86_64-w64-mingw32-gcc
#GXX:=g++
ARGS_GXX:=
ARGS_GXX += -Wall
ARGS_GXX += -O3
ARGS_GXX += -m64
ARGS_GXX += -fPIC
ifeq ($(USE_OPENMP), 1)
ARGS_GXX += -fopenmp
endif
COMMAND_COMPILE_GXX=$(GXX) -c -o $@ $< $(ARGS_GXX) $(INCLUDES) $(DEFINES)
COMMAND_GET_DEPENDENCIES_GXX=@$(GXX) -M $< $(ARGS_GXX) $(INCLUDES) $(DEFINES) > $@.dep
# openmp
ifeq ($(USE_OPENMP), 1)
LIBS += -lgomp
else
DEFINES += -DDISABLE_OPENMP
endif
DEFINES += -DDISABLE_OPENCV
DEFINES += -DDISABLE_CUDA
# target: solver
SOLVER_SOURCES:=
SOLVER_SOURCES += $(shell find $(SOLVER_SOURCE_DIR) -name '*.cpp')
SOLVER_OBJECTS:=$(foreach file, $(SOLVER_SOURCES), $(TMP_DIR)/$(file).o)
SOLVER_DEPENDENCIES:=$(foreach file, $(SOLVER_OBJECTS), $(file).dep)
-include $(SOLVER_DEPENDENCIES)
SOLVER_TARGET:=$(TMP_DIR)/$(SOLVER_SOURCE_DIR)/libfastms.o
TARGETS += $(SOLVER_TARGET)
COMMAND_LINK_SOLVER=ld -r -o $@ $^
# target: main
MAIN_SOURCES:=
MAIN_SOURCES += $(shell find src/examples -name '*.cpp')
MAIN_OBJECTS:=$(foreach file, $(MAIN_SOURCES), $(TMP_DIR)/$(file).o)
MAIN_OBJECTS += $(SOLVER_TARGET)
MAIN_DEPENDENCIES:=$(foreach file, $(MAIN_OBJECTS), $(file).dep)
-include $(MAIN_DEPENDENCIES)
MAIN_TARGET:=main
TARGETS += $(MAIN_TARGET)
COMMAND_LINK_MAIN=$(GXX) -o $@ $^ $(LIBS)
# mex
ifeq ($(USE_MEX), 1)
MATLAB_DIR:=/c/Program\ Files/MATLAB/r2017a
ifeq ($(wildcard $(MATLAB_DIR)/bin/win64),)
$(info WARNING: Did not find MATLAB in the specified directory $(MATLAB_DIR), disabling mex target compilation.)
USE_MEX:=
endif
endif
ifeq ($(USE_MEX), 1)
MEX_SUFFIX:=mexw64
MEX_SOURCES:=$(shell find src/mex -name '*.cpp')
MEX_OBJECTS:=$(foreach file, $(MEX_SOURCES), $(TMP_DIR)/$(file).o)
MEX_OBJECTS += $(SOLVER_TARGET)
MEX_DEPENDENCIES:=$(foreach file, $(MEX_OBJECTS), $(file).dep)
-include $(MEX_DEPENDENCIES)
MEX_DEFINES := $(DEFINES)
MEX_INCLUDES :=$(INCLUDES) -I$(MATLAB_DIR)/extern/include
MATLAB_LIB_DIR1:=$(MATLAB_DIR)/extern/lib/win64/mingw64
MATLAB_LIB_DIR2:=$(MATLAB_DIR)/bin/win64
MEX_LIBS:=$(LIBS) -L$(MATLAB_LIB_DIR1) -L$(MATLAB_LIB_DIR2) -lmex -lmx
MEX_TARGET:=examples/matlab/fastms_mex.$(MEX_SUFFIX)
TARGETS += $(MEX_TARGET)
COMMAND_COMPILE_GXX_MEX=$(GXX) -c -o $@ $< $(ARGS_GXX) $(MEX_INCLUDES) $(MEX_DEFINES)
COMMAND_GET_DEPENDENCIES_GXX_MEX=@$(GXX) -M $< $(ARGS_GXX) $(MEX_INCLUDES) $(MEX_DEFINES) > $@.dep
COMMAND_LINK_MEX=$(GXX) -o $@ $^ -shared $(MEX_LIBS)
else
DEFINES += -DDISABLE_MEX
endif
# common commands
COMMAND_POSTPROCESS_DEPENDENCIES=@echo $@:`sed 's/.*://' $@.dep | tr "\n" " " | sed 's/\\\\/ /g'` > $@.dep; sed -e 's/^.*://' -e 's/ */::/g' $@.dep | tr ":" "\n" | sed -e 's/$$/:/' -e 's/^:$$//' >> $@.dep; echo >> $@.dep
COMMAND_MAKE_TARGET_DIR=@mkdir -p $(shell dirname $@)
COMMAND_CLEAN=@rm -rf $(TMP_DIR) $(TARGETS)
targets: $(TARGETS)
# solver
$(TMP_DIR)/$(SOLVER_SOURCE_DIR)/%.cpp.o: $(SOLVER_SOURCE_DIR)/%.cpp Makefile
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_COMPILE_GXX)
$(COMMAND_GET_DEPENDENCIES_GXX)
$(COMMAND_POSTPROCESS_DEPENDENCIES)
$(TMP_DIR)/$(SOLVER_SOURCE_DIR)/%.cu.o: $(SOLVER_SOURCE_DIR)/%.cu Makefile
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_NVCC_COMPILE)
$(COMMAND_GET_DEPENDENCIES_NVCC)
$(COMMAND_POSTPROCESS_DEPENDENCIES)
$(SOLVER_TARGET): $(SOLVER_OBJECTS)
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_LINK_SOLVER)
# main
$(TMP_DIR)/src/examples/%.cpp.o: src/examples/%.cpp Makefile
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_COMPILE_GXX)
$(COMMAND_GET_DEPENDENCIES_GXX)
$(COMMAND_POSTPROCESS_DEPENDENCIES)
$(MAIN_TARGET): $(MAIN_OBJECTS)
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_LINK_MAIN)
# mex
$(TMP_DIR)/src/mex/%.cpp.o: src/mex/%.cpp Makefile
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_COMPILE_GXX_MEX)
$(COMMAND_GET_DEPENDENCIES_GXX_MEX)
$(COMMAND_POSTPROCESS_DEPENDENCIES)
$(MEX_TARGET): $(MEX_OBJECTS)
$(COMMAND_MAKE_TARGET_DIR)
$(COMMAND_LINK_MEX)
clean:
$(COMMAND_CLEAN)
当我使用g作为我的编译器时,问题是(a)它不支持-m64位标志和(b)它无法找到库-lmex -lmx,尽管我链接libmex目录 . make文件中的lib和libmx.lib(参见MEX_LIBS) . 一些在线指南建议直接链接dll文件的目录limbex.dll和libmx.dll,但是我得到一个错误,如“不支持的文件格式”
当我使用x86_64-w64-mingw32-gcc作为我的编译器时,我会遇到错误:tmp / src / libfastms / solver / solver.cpp.o:文件无法识别:文件格式无法识别 . 网上帖子说这是因为之前版本的残留.o文件,但我确保这些都是干净的 . 我不知道为什么会这样 .
1 回答
您可以取消Makefile并直接从MATLAB编译所有内容,以生成一个独立的MEX文件 .
我将VS2015配置为编译器,但您可以使用MATLAB版本支持的任何编译器(运行
mex -setup
并选择一个,包括MinGW-w64,如果需要) .download并解压缩源代码,比如
C:\fastms
该代码在
src\libfastms\util\timer.h
中实现了一个简单的秒表来报告时间统计数据 . 它使用来自<sys/time.h>
的gettimeofday
,如果您're using MSVC (it'是POSIX Headers ,则不可用 . 你可以find a Windows replacement for it,但由于它对实现并不重要,我只是用虚函数替换它: