是的,标题看起来很奇怪,但这个标题与标题一样奇怪。 我写了一个ROOT脚本,这个脚本的结果必须画两个直方图。脚本有一些ROOT头文件和随机数生成器。当我用终端
运行时$ root example.cpp
但是当使用cmake编译到exe文件时,它无法正常工作。结果与终端输出不匹配,并且-i think-random generator无法正常工作。此输出使这种情况变得清晰,
正如您在此直方图中看到的那样,值堆叠在一些值上。我很困惑。 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(); }
和CMakeLists.txt:
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})
根库包括cmake。因为TLorentzVector命令在结果中有效。但是Random命令有奇怪的行为。 是否CMakeLists.txt错误或者我错过了重要的事情。
答案 0 :(得分:3)
当您将ROOT作为宏脚本运行时,它会对您的代码应该如何做出某些假设。编译代码时,它不会做出相同的假设。
在您的情况下,ROOT假定您填充直方图的变量是浮点数,而您的编译器认为它们是整数。 (这将是因为它导入的一些数学库,作为有根据的猜测)
如果ROOT和编译器之间存在一些差异,编译器总是正确的。
确保一致行为的唯一方法是编写代码,使其明确。例如,对变量进行转换,这些变量将由编译器解释为整数。