C++ CMake';未定义的引用';CERN-ROOT错误

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

我正在为CERN ROOT编写一个小的补充,现在无法消除我使用的ROOT中的每个函数(以及我的类)上的“未定义引用”错误。找不到解决此问题的方法,请在此处寻求帮助)

我的操作系统是LinuxMint19。我用g++作为我的C++编译器,但是我尝试了CLAN++,没有什么区别。 我从他们的github下载了ROOT源代码,现在在我的计算机上构建了它。root--version的输出如下:

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
等等。它们有很多。我的主目录中有根目录的路径