【问题标题】:Repurposing a makefile to allow for c++ compilation in cygwin重新利用 makefile 以允许在 cygwin 中进行 c++ 编译
【发布时间】:2017-06-08 04:42:13
【问题描述】:

长话短说,这个库 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 make 文件中的 libmex.lib 和 libmx.lib(参见 MEX_LIBS)。一些在线指南建议直接链接dll文件的目录limbex.dll和libmx.dll,但我收到“不支持的文件格式”之类的错误

当我按照一些帖子的建议使用 x86_64-w64-mingw32-gcc 作为我的编译器时,我遇到了错误: tmp/src/libfastms/solver/solver.cpp.o:文件无法识别:文件格式无法识别。网上的帖子说这是因为以前版本中残留的 .o 文件,但我确保这些都是干净的。我不知道这是为什么。

【问题讨论】:

  • -m64 不需要,因为 x86_64-w64-mingw32-gcc 已经是 64 位了。你安装了 mingw64-x86_64-binutils 吗?可以不用makefile直接编译吗?

标签: gcc makefile cygwin mingw mex


【解决方案1】:

您可以取消 Makefile,直接从 MATLAB 编译所有内容,生成一个独立的 MEX 文件。

我已将 VS2015 配置为编译器,但您可以使用您的 MATLAB 版本支持的任何编译器(运行 mex -setup 并选择一个,如果需要,包括 MinGW-w64)。

  1. download 并提取源代码,比如C:\fastms

  2. 代码在src\libfastms\util\timer.h 中实现了一个简单的秒表来报告时间统计信息。它使用来自&lt;sys/time.h&gt; 的gettimeofday,如果您使用的是MSVC(它是POSIX 标头),则不可用。你可以find a Windows replacement for it,但由于它对实现并不重要,我只是用一个虚拟函数替换了它:

    //#include <sys/time.h>   // <-- comment this line
    ...
    double get_cur_seconds()
    {
      return 0;  // <-- replace code with just this
    }
    
  3. 启动 MATLAB 并运行以下命令:

    cd('C:\fastms')
    mex -DDISABLE_CUDA -DDISABLE_OPENCV -largeArrayDims -outdir examples\matlab src\mex\fastms_mex.cpp src\libfastms\solver\*.cpp src\libfastms\util\*.cpp -Isrc\mex -Isrc\libfastms -Isrc\libfastms\solver -Isrc\libfastms\util
    
  4. 现在您可以使用包含的示例之一来测试库:

    cd('C:\fastms\examples\matlab')
    example1()
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多