Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cmake.exe和terminal命令之间的根结果不匹配_C++_Cmake_Root Framework - Fatal编程技术网

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})