C++ cmake.exe和terminal命令之间的根结果不匹配
是的,标题看起来很奇怪,但这个问题和标题一样奇怪。 我已经写了一个根脚本,这个脚本的结果必须绘制两个直方图。脚本有几个根头文件和随机数生成器。当我用终端运行这个时C++ cmake.exe和terminal命令之间的根结果不匹配,c++,cmake,root-framework,C++,Cmake,Root Framework,是的,标题看起来很奇怪,但这个问题和标题一样奇怪。 我已经写了一个根脚本,这个脚本的结果必须绘制两个直方图。脚本有几个根头文件和随机数生成器。当我用终端运行这个时 $ root example.cpp 它已经按照我想要的方式执行了。输出直方图; 但是当用cmake编译成exe文件时,它不能正常工作。结果和终端输出不匹配,我认为随机发生器工作不正常。这一结果说明了这一情况, 正如您在该直方图中看到的,值叠加在几个值上。有一点我很困惑。CMake命令和生成exe文件未给出错误,已正确生成。但相
$ root example.cpp
它已经按照我想要的方式执行了。输出直方图;
但是当用cmake编译成exe文件时,它不能正常工作。结果和终端输出不匹配,我认为随机发生器工作不正常。这一结果说明了这一情况,
正如您在该直方图中看到的,值叠加在几个值上。有一点我很困惑。CMake命令和生成exe文件未给出错误,已正确生成。但相同的代码、相同的随机生成器和结果彼此之间有很大的不同。
我的意见是CMakeLists.txt文件没有正确准备。因为我在互联网示例和编辑中找到了它。
这是C++文件:
#include "TRandom3.h"
#include "TH1F.h"
#include "TLorentzVector.h"
#include "TCanvas.h"
void TLV()
{
TCanvas* c1 = new TCanvas("table", "TLVs", 800,800 );
TH1F* histoM = new TH1F("masses","Lorentz Vectors' Masses",600,0,20.);
TH1F* histoPt = new TH1F("pts","Lorentz PTs", 600,-0.5 , 7.);
TRandom3* uret = new TRandom3(); // - RANDOM GENERATOR
uret->SetSeed(855); // SEED
TLorentzVector v1; // - DECLARING LORENTZ
TLorentzVector v2; // VECTORS
TPad *pad1 = new TPad("pad1", "pad1", 0, 0.5, 1, 1.0);
TPad *pad2 = new TPad("pad2", "pad2", 0, 0.05, 1, 0.5);
for (int j=0;j<100;j++){
// doing some calculation
histoPt->Fill(tb2); //INSERT VALUES TO HISTOGRAMS
histoM->Fill(tb1);
};
// drawing
}
/*---------- END OF FUNCTION -------------*/
int main() { TLV(); }
根库包括cmakewell。因为TLorentzVector命令在结果中有效。但是随机命令有奇怪的行为。
CMakeLists.txt是错误的还是我遗漏了一些重要的内容。当您以宏脚本的形式运行ROOT时,它会对您的代码应该如何运行做出某些假设。然而,当您编译代码时,它不会做出相同的假设 在您的例子中,ROOT假设填充直方图的变量是float,而编译器认为它们是int。(这是因为它导入了一些数学库,这是一个有根据的猜测) 如果ROOT和编译器之间存在一些差异,那么编译器总是正确的
确保行为一致的唯一方法是编写明确的代码。例如,对编译器解释为整数的变量使用强制转换。您能发布完整的代码吗?也就是说,你是如何得到tb1和tb2的。这可能是由于代码中的错误导致了未定义的行为,这可能在根C++解释程序和正确编译的版本之间有所不同。我认为问题在于编译器默认为整数版本,因此您的v1px等不是1就是0。解释器还包含了一些其他的东西,所以你可能会免费得到一个浮动的abs。@NickEdwards我刚刚意识到abs()命令不必要而且对这些头文件无效出于好奇,在终端
根示例.cpp+
中编译时会得到什么?
cmake_minimum_required(VERSION 2.8)
project(TLV)
set(CMAKE_CXX_FLAGS "-O3 -fPIC -Wall -Wextra -std=c++11 -m64")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} $ENV{ROOTSYS}/etc/cmake)
#print conf
message(STATUS "Environmental CMAKE_MODULE_PATH is $ENV{ROOTSYS}")
find_package(ROOT MODULE REQUIRED Cling TreePlayer Tree Rint Postscript Matrix RIO Core Foam RooStats RooFit RooFitCore Gpad Graf3d Graf Hist Net TMVA XMLIO MLP)
include(${ROOT_USE_FILE})
message(STATUS "Environmental ROOTSYS is $ENV{ROOTSYS}")
message(STATUS "found root at: ${ROOT_USE_FILE}")
message(STATUS "ROOT_LIBRARIES=${ROOT_LIBRARIES}")
set(EXECUTABLE_OUTPUT_PATH EXE_CIKTI)
add_executable( TLV TLV.cpp )
target_link_libraries(TLV ${ROOT_LIBRARIES})