C++ CMake';未定义的引用';CERN-ROOT错误
我正在为CERN ROOT编写一个小的补充,现在无法消除我使用的ROOT中的每个函数(以及我的类)上的“未定义引用”错误。找不到解决此问题的方法,请在此处寻求帮助) 我的操作系统是LinuxMint19。我用g++作为我的C++编译器,但是我尝试了CLAN++,没有什么区别。 我从他们的github下载了ROOT源代码,现在在我的计算机上构建了它。root--version的输出如下:C++ CMake';未定义的引用';CERN-ROOT错误,c++,cmake,C++,Cmake,我正在为CERN ROOT编写一个小的补充,现在无法消除我使用的ROOT中的每个函数(以及我的类)上的“未定义引用”错误。找不到解决此问题的方法,请在此处寻求帮助) 我的操作系统是LinuxMint19。我用g++作为我的C++编译器,但是我尝试了CLAN++,没有什么区别。 我从他们的github下载了ROOT源代码,现在在我的计算机上构建了它。root--version的输出如下: ROOT Version: 6.19/01 Built for linuxx8664gcc on Sep 29
ROOT Version: 6.19/01
Built for linuxx8664gcc on Sep 29 2019, 14:25:35
From heads/master@v6-19-01-1167-gbec9f2d1f7
这是我的项目结构:
ParentFolder
--CMakeLists.txt
--General
----include/...
----source/...
----CMakeLists.txt
----LinkDef.h
--Test
----include/...
----source/...
----CMakeLists.txt
顶级CMakeLists.txt中的重要行包括:
find_package(ROOT REQUIRED)
list(APPEND CMAKE_PREFIX_PATH $ENV{ROOTSYS})
include(${ROOT_USE_FILE})
add_subdirectory("./General")
add_subdirectory("./Test")
从Test/CmakeLists.txt:
add_executable(Test source/test_main.cpp)
target_include_directories(Test PUBLIC "./include")
target_link_libraries(Test PUBLIC General GTest::GTest GTest::Main ${ROOT_LIBRARIES})
file(GLOB_RECURSE SOURCES . source/*.cpp)
ROOT_GENERATE_DICTIONARY(GeoManagerExtractor LINKDEF LinkDef.h)
add_library(General SHARED ${SOURCES} GeoManagerExtractor.cxx)
target_link_libraries(General ${ROOT_LIBRARIES})
target_include_directories(General PUBLIC "./include")
file(GLOB_RECURSE SOURCES2 . $ENV{ROOTSYS}/lib/*.so)
add_library(General SHARED ${SOURCES} ${SOURCES2} GeoManagerExtractor.cxx)
从General/CmakeLists.txt:
add_executable(Test source/test_main.cpp)
target_include_directories(Test PUBLIC "./include")
target_link_libraries(Test PUBLIC General GTest::GTest GTest::Main ${ROOT_LIBRARIES})
file(GLOB_RECURSE SOURCES . source/*.cpp)
ROOT_GENERATE_DICTIONARY(GeoManagerExtractor LINKDEF LinkDef.h)
add_library(General SHARED ${SOURCES} GeoManagerExtractor.cxx)
target_link_libraries(General ${ROOT_LIBRARIES})
target_include_directories(General PUBLIC "./include")
file(GLOB_RECURSE SOURCES2 . $ENV{ROOTSYS}/lib/*.so)
add_library(General SHARED ${SOURCES} ${SOURCES2} GeoManagerExtractor.cxx)
以下是CMake(在使用clang++时)生成的前几行代码
下面是test_main.cpp中的几行代码:
TGeoManager::Import(“../root\u tests/geofile\u full.root”);
if(gGeoManager==nullptr){
我已经设法编译了我的项目。
事实证明,根开发人员提供的脚本没有将包含TGeoManager实现的.so文件包含在根库中(感谢Kamil Cuk让我注意到这个变量)。很难找到,因为这个类在GRANG中正常工作(根中包含c++解释器)这个类几乎是我在项目中使用的唯一一个根类,所以我假设整个根库没有正确链接。在我发现这个问题后,我修复了我的CMake文件,如下所示(来自General/CmakeLists.txt):
这消除了所有“对'gGeoManager'的未定义引用”和类似的内容,但“对'vtable for TGeoManagerExporter'的未定义引用”(TGeoManagerExporter是我自己的类)但是,我发现这个错误是由反射功能引起的,所以作为临时解决方案,我不会激活它。如果我解决了这个问题,我会在这里发表评论。那么ROOT\u库的背后是什么?/path/to/ROOT/compile/lib/libCore.so/path/to/ROOT/npm/ROOT/compile/libImt.so/path/to/ROOT/ROOT/ROOT/compile/compile/lib/libRIO.so
等等。它们有很多。我的主目录中有根目录的路径