我有一些 C++ 代码的 makefile(粘贴在下面),它有一个恼人的问题,当我执行 make clean 时,依赖文件被编译(在再次被删除之前),这使得 清理太慢了。依赖规则是
$(DEPENDDIR)%.d: %.cpp
@mkdir -p $(DEPENDDIR)
$(CXX) -M -MG -MT $(OBJECTDIR)$*.o $(CXXFLAGS) $< > $@
谁能看出是什么问题?
我尝试将依赖项移动到编译对象的部分,即:
$(OBJECTDIR)%.o: %.cpp
@mkdir -p $(OBJECTDIR) # $(dir $@)
@echo " "
$(CXX) -M -MG -MT $@ $(CXXFLAGS) $< \
-MF $(patsubst $(OBJECTDIR)%.o, $(DEPENDDIR)%.d, $@)
但是没有创建头文件version.hpp(并且编译失败)
KERNEL := $(shell uname -s)
PROGNAME=nextsim.exec
CXX = g++
# setting the C++ standard according to the gcc compiler version (from gcc-5.2, the default is C++14)
ifeq ($(shell echo `$(CXX) -dumpversion | cut -f1-2 -d.` \>= 5.2 | sed -e 's/\.//g' | bc),1)
CXXFLAGS += -std=c++14
else
CXXFLAGS += -std=c++11
endif
# add g++ option flags
CXXFLAGS += -ftemplate-depth-256 -Wno-inline \
-fPIC -fopenmp \
-DHAVE_CONFIG_H -D_MULTITHREADING_
ifdef NEXTSIM_COMPILE_VERBOSE
CXXFLAGS += -v
endif
ifdef USE_OASIS
CXXFLAGS += -DOASIS
CXXFLAGS += -I $(NEXTSIMDIR)/modules/oasis/include
LDFLAGS += -lgfortran
LDFLAGS += -L $(NEXTSIMDIR)/lib -loasis
CHAN = MPI1
#LIBPSMILE = $(OASIS_DIR)/lib/libpsmile.${CHAN}.a $(OASIS_DIR)/lib/libmct.a $(OASIS_DIR)/lib/libmpeu.a $(OASIS_DIR)/lib/libscrip.a
endif
ifneq (,$(strip $(filter DEBUG Debug debug PROFILE Profile profile,$(NEXTSIM_BUILD_TYPE))))
#ifeq ($(NEXTSIM_BUILD_TYPE),$(filter $(NEXTSIM_BUILD_TYPE),Debug debug))
CXXFLAGS := $(filter-out -O3 -pthread,$(CXXFLAGS))
CXXFLAGS += -g -O0 -DNDEBUG
ifneq (,$(strip $(filter PROFILE Profile profile,$(NEXTSIM_BUILD_TYPE))))
CXXFLAGS += -DWITHGPERFTOOLS
endif
ifneq ($(KERNEL),Linux)
CXXFLAGS += -Wl,-no_pie
endif
else
CXXFLAGS += -O3 -pthread
endif
# add include paths
CXXFLAGS += -I $(NEXTSIMDIR)/core/include
CXXFLAGS += -isystem $(NEXTSIMDIR)/contrib/bamg/include # suppress annoying compilation warnings from -I
CXXFLAGS += -isystem $(NEXTSIMDIR)/contrib/mapx/include # suppress annoying compilation warnings from -I
# CXXFLAGS += -I $(NEXTSIMDIR)/contrib/interp/include
ifdef USE_ENSEMBLE
CXXFLAGS += -DENSEMBLE
CXXFLAGS += -I $(NEXTSIMDIR)/modules/enkf/perturbation/include
endif
ifdef USE_AEROBULK
CXXFLAGS += -I $(AEROBULK_DIR)/include
CXXFLAGS += -DAEROBULK
endif
# openmpi
CXXFLAGS += -I $(OPENMPI_INCLUDE_DIR)/
# petsc
CXXFLAGS += -I $(PETSC_DIR)/include
# boost
CXXFLAGS += -I $(BOOST_INCDIR)/ -I .
# netcdf
CXXFLAGS += -I $(NETCDF_DIR)/include
# gmsh
CXXFLAGS += -I $(GMSH_DIR)/include/gmsh
CXXFLAGS += -I /opt/local/include
ifeq ($(KERNEL),Linux)
#CXXFLAGS += -std=c++0x -std=c++11 -pedantic -ftemplate-depth-256 -Wno-inline -fPIC -g -lm -pthread -v #-MMD -MP -lm -pthread -v
else
ifeq ($(CXX),clang)
CXXFLAGS += -stdlib=libc++
endif
CXXFLAGS += -I /usr/local/include #-I /opt/local/include/openmpi-mp
#LDFLAGS += -Wl,-rpath,/usr/local/lib #-Wl,-rpath,/opt/local/lib/openmpi-mp
#LDFLAGS += -L /usr/local/lib #-L /opt/local/lib/openmpi-mp -lmpi_cxx -lmpi -ldl -lstdc++ -lpthread
ifeq ($(CXX),clang)
LDFLAGS += -stdlib=libc++
endif
endif
LDFLAGS += -L /usr/local/lib
LDFLAGS += -Wl,-rpath,$(OPENMPI_LIB_DIR)/
ifndef MACHINE_HEXAGON
LDFLAGS += -L $(OPENMPI_LIB_DIR)/ -lmpi_cxx -lmpi -ldl -lstdc++ #-lpthread
else
LDFLAGS += -L $(OPENMPI_LIB_DIR)/ -lmpichcxx -lmpich -ldl -lstdc++ #-lpthread #-lssl -luuid -lpthread -lrt
LDFLAGS += -Wl,-rpath,$(BLAS_LAPACK_DIR)/lib
LDFLAGS += -L $(BLAS_LAPACK_DIR)/lib -lsci_gnu_mp
endif
LDFLAGS += -Wl,-rpath,$(NETCDF_DIR)/lib -L $(NETCDF_DIR)/lib -lnetcdf_c++4
LDFLAGS += -Wl,-rpath,$(BOOST_LIBDIR)
LDFLAGS += -L $(BOOST_LIBDIR) -lboost_program_options -lboost_filesystem -lboost_system -lboost_serialization -lboost_mpi -lboost_date_time
LDFLAGS += -Wl,-rpath,$(PETSC_DIR)/lib
LDFLAGS += -L $(PETSC_DIR)/lib -lpetsc
LDFLAGS += -Wl,-rpath,$(NEXTSIMDIR)/lib
LDFLAGS += -L $(NEXTSIMDIR)/lib -lbamg
#LDFLAGS += -L $(NEXTSIMDIR)/lib -linterp
LDFLAGS += -L $(NEXTSIMDIR)/lib -lmapx
#LDFLAGS += -L $(NEXTSIMDIR)/lib -loasis
ifdef USE_ENSEMBLE
LDFLAGS += -L $(NEXTSIMDIR)/lib -lpseudo2D
LDFLAGS += -lgfortran
endif
ifdef USE_AEROBULK
LDFLAGS += -L $(AEROBULK_DIR)/lib -laerobulk_cxx -laerobulk
LDFLAGS += -lgfortran
endif
ifneq (,$(strip $(filter DEBUG Debug debug PROFILE Profile profile,$(NEXTSIM_BUILD_TYPE))))
#ifeq ($(NEXTSIM_BUILD_TYPE),$(filter $(NEXTSIM_BUILD_TYPE),Debug debug))
LDFLAGS += -Wl,-rpath,/opt/local/lib
ifneq (,$(strip $(filter PROFILE Profile profile,$(NEXTSIM_BUILD_TYPE))))
LDFLAGS += -L /opt/local/lib -lprofiler
endif
endif
LDFLAGS += -L $(NEXTSIMDIR)/lib -lnextsim
OBJECTDIR=$(NEXTSIMDIR)/objs/
DEPENDDIR=$(NEXTSIMDIR)/.deps/
BINARYDIR=bin/
# C++ files
CXXSRCDIR=.
CXXHDRDIR=.
CXXSRC=$(wildcard $(CXXSRCDIR)/*.cpp)
# We must exclude the version.hpp file from the list of header files because otherwise we get a circular dependency
CXXHDR=$(filter-out $(CXXHDRDIR)/version.hpp, $(wildcard $(CXXHDRDIR)/*.hpp))
OBJS=$(CXXSRC:%.cpp=$(OBJECTDIR)%.o)
DEPS=$(CXXSRC:%.cpp=$(DEPENDDIR)%.d)
# Rules to always execute.
.PHONY: exec clean mrproper all cleanall mrproperall
# Default action.
exec: $(PROGNAME)
# Create a header file with the git version
version.hpp: version.sh $(CXXSRC) $(CXXHDR)
$(SHELL) -x $<
# Delete the object files.
clean:
@echo " "
$(RM) $(OBJS) $(DEPS)
@echo " "
mrproper: clean
$(RM) $(BINARYDIR)$(PROGNAME)
@echo " "
# Rule for making the actual target
lines="=========="
Lines=$(lines)$(lines)$(lines)$(lines)$(lines)$(lines)$(lines)$(lines)
$(PROGNAME): $(OBJS) #$(CCOBJS)
@mkdir -p $(BINARYDIR)
@echo " "
@echo $(Lines)$(Lines)
@echo "Creating executable: $(BINARYDIR)$(PROGNAME)"
@echo $(Lines)$(Lines)
@echo " "
$(CXX) $(CXXFLAGS) -o $(BINARYDIR)$@ $^ $(LDFLAGS)
@echo " "
@echo $(Lines)$(Lines)
@echo "Created executable: $(BINARYDIR)$(PROGNAME)"
@echo $(Lines)$(Lines)
@echo " "
# Rules for object files from cpp files
$(OBJECTDIR)%.o: %.cpp
@mkdir -p $(OBJECTDIR) # $(dir $@)
@echo " "
$(CXX) -o $@ -c $< $(CXXFLAGS)
# Make dependancy rules
$(DEPENDDIR)%.d: %.cpp
@mkdir -p $(DEPENDDIR)
$(CXX) -M -MG -MT $(OBJECTDIR)$*.o $(CXXFLAGS) $< > $@
# The compilation depends on this Makefile.
$(OBJS): Makefile
# Make everything
all:
cd ..; $(MAKE) all
# Clean everything
cleanall:
cd ..; $(MAKE) clean
# Properly clean everything
mrproperall:
cd ..; $(MAKE) mrproper
# Properly clean & recompile
fresh:
cd ..; $(MAKE) fresh
-include $(DEPS)
最佳答案
它正在构建,因为您正在使用 -include $(DEPS)。
If an included makefile cannot be found in any of these directories, a warning message is generated, but it is not an immediately fatal error; processing of the makefile containing the include continues. Once it has finished reading makefiles, make will try to remake any that are out of date or don’t exist. See How Makefiles Are Remade. Only after it has tried to find a way to remake a makefile and failed, will make diagnose the missing makefile as a fatal error.
然后它继续说:
If you want make to simply ignore a makefile which does not exist or cannot be remade, with no error message, use the -include directive instead of include, like this:
-include filenames…This acts like include in every way except that there is no error (not even a warning) if any of the filenames (or any prerequisites of any of the filenames) do not exist or cannot be remade.
不可否认,这可能有不同的解释方式。我刚刚验证它确实尝试在 -include 行上重新制作文件,该行具有要重新制作的明确规则:
all:
@echo building $@
foo.d :
@echo building $@
@touch $@
-include foo.d bar.d
给出:
tmp> make all
building foo.d
building all
因此,这留下了一个有趣的案例来说明如何解决您的问题。对依赖文件有一个单独的规则确实会增加你的编译时间——你现在要解析每个源文件两次——一次生成 .d,一次编译。这个不好。我相信结合依赖规则和 .o 最符合您的利益。然后让依赖version.hpp的$(OBJS)的子集显式依赖它,应该就可以了。
关于c++ - 不应该应用的 makefile 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749393/
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD