【问题标题】:Makefile and .Mak File + CodeBlocks and VStudioMakefile 和 .Mak 文件 + CodeBlocks 和 VStudio
【发布时间】:2009-09-17 12:44:04
【问题描述】:

我对整个 makefile 概念有点陌生,所以我对此有一些疑问。

我正在使用 linux 中的 CodeBlocks 创建一个项目,我使用了一个名为 cbp2mak 的工具从 CodeBlocks 项目中创建了一个 .make 文件(如果有人知道更好的工具,请告诉我)。

现在我不确定 .mak 和 .makefile 之间有什么区别,谁能告诉我?我可以使用“make -C .mak”编译 .mak,但有什么区别?

我尝试使用它的原因是因为我想为我的项目提供源代码并希望它可以在 linux 和 windows 中构建,所以我不想给他们我的 codeblocks 项目文件。所以我想我可以使用一个可用于在 linux 和 windows 中构建的 makefile。

我还想在 Windows 中检查 MinGW 和 VC++ 编译器是否存在并使用这两个编译器构建源代码,在 Linux 中它将仅使用 GNU GCC。

.mak 文件还有一些宏来确定要构建的内容,具体取决于它是在 windows 还是 linux 上运行,因为存在特定于平台的文件。

所以问题:

-.mak 和 .makefile 有什么区别

-我可以在 Windows 中运行 .mak 文件吗?说使用视觉工作室?

-对于我现在正在做的事情,是否有更好的解决方案? (我使用了 cpb2mak,因为它会自动生成一个 .mak 文件,因为我不知道如何创建 makefile,所以可以节省很多时间)

也请随时提供有关此的任何建议或提示。

编辑:

我现在已经上传了完整的 .mak 文件

我的项目也是一个库,我构建了它的静态和共享版本。 .mak 文件是自动生成的,但我使用 ifdef 和“shell,uname”函数对平台句柄进行了处理

# project performer-1.0


export PATH := /opt/wx/2.8/bin:$(PATH)
export LD_LIBRARY_PATH := /opt/wx/2.8/lib:$(LD_LIBRARY_PATH)

_WX = /home/gr/projects/gui/codeblocks/wx
_WX.LIB = $(_WX)/lib
_WX.INCLUDE = $(_WX)/include

_CB = /home/gr/projects/gui/codeblocks/cb/src
_CB.INCLUDE = $(_CB)/include
_CB.LIB = $(_CB)/devel



CFLAGS_C = $(filter-out -include "sdk.h",$(CFLAGS))

# -----------------------------------------

# MAKE_DEP = -MMD -MT $@ -MF $(@:.o=.d)

CFLAGS = -Wall 
INCLUDES = -I../performer-1.0 
LDFLAGS =  -s
RCFLAGS = 
LDLIBS = $(T_LDLIBS) -lrt -lboost_regex-gcc43-mt -lxerces-c  -lstdc++

LINK_exe = gcc -o $@ $^ $(LDFLAGS) $(LDLIBS)
LINK_con = gcc -o $@ $^ $(LDFLAGS) $(LDLIBS)
LINK_dll = gcc -o $@ $^ $(LDFLAGS) $(LDLIBS) -shared
LINK_lib = rm -f $@ && ar rcs $@ $^
COMPILE_c = gcc $(CFLAGS_C) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
COMPILE_cpp = g++ $(CFLAGS) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
COMPILE_rc = windres $(RCFLAGS) -J rc -O coff -i $< -o $@ -I$(dir $<)

%.o : %.c ; $(COMPILE_c)
%.o : %.cpp ; $(COMPILE_cpp)
%.o : %.cxx ; $(COMPILE_cpp)
%.o : %.rc ; $(COMPILE_rc)
.SUFFIXES: .o .d .c .cpp .cxx .rc

all: all.before all.targets all.after

all.before :
    -
all.after : $(FIRST_TARGET)

# -----------------------------------------------------------
ifeq "$(shell uname)" "Linux"
# -----------------------------------------------------------
    
all.targets : Linux_Dynamic_target Linux_Static_target 

# -----------------------------------------------------------
else
# -----------------------------------------------------------

all.targets : Windows_Dynamic_target

# -----------------------------------------------------------
endif
# -----------------------------------------------------------

clean :
    rm -fv $(clean.OBJ)
    rm -fv $(DEP_FILES)

.PHONY: all clean distclean

# -----------------------------------------------------------
ifeq "$(shell uname)" "Linux"
# -----------------------------------------------------------

# -----------------------------------------
# Linux_Dynamic_target

Linux_Dynamic_target.BIN = libs/libperformer-1.so
Linux_Dynamic_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/linux/linfactory.o src/data_collection/linux/linmemprof.o src/data_collection/linux/lintimer.o src/data_collection/linux/procsmaps.o src/data_collection/linux/procstatus.o src/data_collection/pstructs.o src/data_collection/resultxml.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/linux/linfactory.d src/data_collection/linux/linmemprof.d src/data_collection/linux/lintimer.d src/data_collection/linux/procsmaps.d src/data_collection/linux/procstatus.d src/data_collection/pstructs.d src/data_collection/resultxml.d 
clean.OBJ += $(Linux_Dynamic_target.BIN) $(Linux_Dynamic_target.OBJ)

Linux_Dynamic_target : Linux_Dynamic_target.before $(Linux_Dynamic_target.BIN) Linux_Dynamic_target.after_always
Linux_Dynamic_target : CFLAGS += -Wall -g  -Os
Linux_Dynamic_target : INCLUDES += 
Linux_Dynamic_target : RCFLAGS += 
Linux_Dynamic_target : LDFLAGS +=  $(CREATE_LIB) $(CREATE_DEF)
Linux_Dynamic_target : T_LDLIBS = 
ifdef LMAKE
Linux_Dynamic_target : CFLAGS -= -O1 -O2 -g -pipe
endif

Linux_Dynamic_target.before :
    
    
Linux_Dynamic_target.after_always : $(Linux_Dynamic_target.BIN)
    
$(Linux_Dynamic_target.BIN) : $(Linux_Dynamic_target.OBJ)
    $(LINK_dll)

# -----------------------------------------
# Linux_Static_target

Linux_Static_target.BIN = libs/libperformer-1.a
Linux_Static_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/linux/linfactory.o src/data_collection/linux/linmemprof.o src/data_collection/linux/lintimer.o src/data_collection/linux/procsmaps.o src/data_collection/linux/procstatus.o src/data_collection/pstructs.o src/data_collection/resultxml.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/linux/linfactory.d src/data_collection/linux/linmemprof.d src/data_collection/linux/lintimer.d src/data_collection/linux/procsmaps.d src/data_collection/linux/procstatus.d src/data_collection/pstructs.d src/data_collection/resultxml.d 
clean.OBJ += $(Linux_Static_target.BIN) $(Linux_Static_target.OBJ)

Linux_Static_target : Linux_Static_target.before $(Linux_Static_target.BIN) Linux_Static_target.after_always
Linux_Static_target : CFLAGS += -Wall -g  -Os
Linux_Static_target : INCLUDES += 
Linux_Static_target : RCFLAGS += 
Linux_Static_target : LDFLAGS +=   $(CREATE_DEF)
Linux_Static_target : T_LDLIBS = 
ifdef LMAKE
Linux_Static_target : CFLAGS -= -O1 -O2 -g -pipe
endif

Linux_Static_target.before :
    
    
Linux_Static_target.after_always : $(Linux_Static_target.BIN)
    
$(Linux_Static_target.BIN) : $(Linux_Static_target.OBJ)
    $(LINK_lib)
    

# -----------------------------------------

# -----------------------------------------------------------
else
# -----------------------------------------------------------   

# -----------------------------------------
# Windows_Dynamic_target

Windows_Dynamic_target.BIN = libs/performer-1.so
Windows_Dynamic_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/pstructs.o src/data_collection/resultxml.o src/data_collection/windows/winfactory.o src/data_collection/windows/wintimer.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/pstructs.d src/data_collection/resultxml.d src/data_collection/windows/winfactory.d src/data_collection/windows/wintimer.d 
clean.OBJ += $(Windows_Dynamic_target.BIN) $(Windows_Dynamic_target.OBJ)

Windows_Dynamic_target : Windows_Dynamic_target.before $(Windows_Dynamic_target.BIN) Windows_Dynamic_target.after_always
Windows_Dynamic_target : CFLAGS += -Wall -g  -Os
Windows_Dynamic_target : INCLUDES += 
Windows_Dynamic_target : RCFLAGS += 
Windows_Dynamic_target : LDFLAGS +=  $(CREATE_LIB) $(CREATE_DEF)
Windows_Dynamic_target : T_LDLIBS = 
ifdef LMAKE
Windows_Dynamic_target : CFLAGS -= -O1 -O2 -g -pipe
endif

Windows_Dynamic_target.before :
    
    
Windows_Dynamic_target.after_always : $(Windows_Dynamic_target.BIN)
    
$(Windows_Dynamic_target.BIN) : $(Windows_Dynamic_target.OBJ)
    $(LINK_dll)
    
ifdef MAKE_DEP
-include $(DEP_FILES)
endif

# -----------------------------------------------------------
endif
#

【问题讨论】:

    标签: c++ visual-c++ makefile build-automation codeblocks


    【解决方案1】:

    我相信 Glen 的回答是不正确的,因为 mak 和 mk (make) 文件根本不一样。它们都用于自动化构建,但相似之处仅此而已。

    mak 文件是一个微软标准,可以在 Visual Studio 命令提示符下使用以下命令构建:

    nmake /f NAMEOFfile.mak
    

    nmake 是 Visual Studio 的一部分,mak 文件的合成/结构也将不同于 mk (make) 文件。

    Make 或 mk 文件主要用于具有跨平台支持的某些实例的 Linux 构建(前提是 Dev 支持 Windows)。要构建 mk 文件,您需要 Autotools 或 CMake(这些工具在 Windows 和 Linux 中都可用)。 mk 文件还会附带一个配置脚本,该脚本需要在 make 步骤之前运行,而 mak/nmake 则不是这种情况。

    【讨论】:

    【解决方案2】:

    我认为没有区别。它只是一个不同名称的 makefile。

    尝试编辑您的问题并发布 .mak 文件的内容,这样我们会更清楚

    【讨论】:

    • 是的,抱歉,我现在正在从其他地方写信,所以我没有 .mak 文件,但我会按行发布一些内容
    • @iQ 从您发布的内容来看,它确实看起来像一个 Makefile,只是名称不同。
    • 那么微软的nmake实用程序会愉快地运行我生成的.mak文件吗?如果 .mak 文件也想用 MinGW 和 VC++ 编译,nmake 实用程序会抱怨吗?或者有没有更好的工具?
    • 某些 makefile 特定于某些 make 程序。例如 pmake 和标准 make 似乎在运行以彼此为目标的 makefile 时存在问题。 cbp2mak 文档(如果有)说明了什么?
    • 遗憾的是,没有太多文档,只有一个自述文件告诉如何使用它。它只是生成一个我没有在上面发布的 .mak 文件。老实说,我不了解其中的大部分内容,所以我不确定它是否会在 Windows 上运行。我不确定是否有任何好的多平台构建系统,Linux 是主要目标,因此拥有与 gnu 兼容的 make 系统将是理想的。那么cmake呢?这会生成一个可以在 GNU make 系统上编写的 make 文件吗?或者用户是否需要安装我试图避免的 cmake。
    猜你喜欢
    • 2010-09-07
    • 2020-11-30
    • 2010-09-21
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多