Create shared libraries using CMake

Hi.

I am using ROOT version 6.18.04. I am trying to use cmake to create shared libraries. I have an example that is used to create static libraries but the problem is that I am not able to load them in the interpreter. This is the code I am using to generate the libraries:

cmake_minimum_required(VERSION 3.5)

project(HypoTestInv LANGUAGES CXX)

# Using ROOT's CONFIG mode search
# The Makefile method also included (non-explicitly, though): Foam Html MathMore Minuit XMLParser
list(APPEND CMAKE_PREFIX_PATH /Users/cashcrusaders/Applications/root-6.18.04_hist)
find_package(ROOT CONFIG REQUIRED COMPONENTS RooStats RooFit RooFitCore HistFactory)


if(TARGET ROOT::Minuit2)
    message(STATUS "Minuit2 included in ROOT")
else()
    message(STATUS "Minuit2 missing from ROOT, using standalone edition")
    find_package(Minuit2 CONFIG REQUIRED)
endif()


# Set flags and things automagically (not ideal, but simplest for now)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/inc/)
include("${ROOT_USE_FILE}")
message(STATUS "Root use_file Path is: " ${ROOT_USE_FILE})


# This function adds a LinkDef and ROOT dictionary for a library
function(ADD_LIBRARY_LINK_DEF NAME)
    file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/RootDict/${NAME}Dict_LinkDef.h"
            "#ifdef __CINT__\n"
            "#pragma link C++ nestedclasses;\n"
            "#pragma link C++ nestedtypedefs;\n"
            "#pragma link C++ defined_in \"${CMAKE_CURRENT_SOURCE_DIR}/inc/${NAME}.h\";\n"
            "#endif\n")

    root_generate_dictionary(
            G__${NAME}
            ${NAME}.h
            LINKDEF
            "${CMAKE_CURRENT_BINARY_DIR}/RootDict/${NAME}Dict_LinkDef.h"
    )

    add_library(${NAME} STATIC G__${NAME}.cxx ${NAME}.cxx)
#    add_library(${NAME}_DYN SHARED G__${NAME}.cxx ${NAME}.cxx)

    target_link_libraries(${NAME} INTERFACE ${ROOT_LIBRARIES})

    # Link to ROOT's Minuit 2 if available, otherwise standalone edition
    if(TARGET ROOT::Minuit2)
        target_link_libraries(${NAME} INTERFACE ROOT::Minuit2)
    else()
        target_link_libraries(${NAME} INTERFACE Minuit2::Minuit2)
    endif()
endfunction()
# Adding core libraries

add_library_link_def(WorkspaceCalculator)
add_library_link_def(ProfileLikelihoodTestStatEnhanced)
add_library_link_def(LimitCalculator)
add_library_link_def(LikelihoodCalculator)
add_library_link_def(PValueCalculator)
add_library_link_def(FitCalculator)
add_library_link_def(HistFactorySimultaneous)
add_library_link_def(RooSimultaneous1)
add_library_link_def(RooSimGenContext)
add_library_link_def(RooSimSplitGenContext)
add_library_link_def(RooAbsPdf)
#add_library_link_def(RooWorkspace)
add_library_link_def(HypoTestInverter)
#add_library_link_def(FrequentistCalculator)
#add_library_link_def(AsymptoticCalculator)
#add_library_link_def(HybridCalculator)
add_library_link_def(HypoTestCalculatorGeneric)
add_library_link_def(ToyMCSampler)
#add_library_link_def(ModelConfig)


# Adding executables

add_executable(StandardHypoTestInv StandardHypoTestInv.cxx)
target_link_libraries(StandardHypoTestInv PUBLIC
        WorkspaceCalculator ProfileLikelihoodTestStatEnhanced LimitCalculator RooSimultaneous1 HistFactorySimultaneous RooSimGenContext RooSimSplitGenContext HypoTestInverter RooAbsPdf ToyMCSampler)

#add_executable(StandardFrequentistDiscovery StandardFrequentistDiscovery.cxx)
#target_link_libraries(StandardFrequentistDiscovery PUBLIC
#    WorkspaceCalculator ProfileLikelihoodTestStatEnhanced PValueCalculator)

#add_executable(LikelihoodScan LikelihoodScan.cxx)
#target_link_libraries(LikelihoodScan PUBLIC
#    WorkspaceCalculator ProfileLikelihoodTestStatEnhanced LikelihoodCalculator)

#add_executable(SimpleFit SimpleFit.cxx)
#target_link_libraries(SimpleFit PUBLIC
#    WorkspaceCalculator ProfileLikelihoodTestStatEnhanced FitCalculator)


Thank you in adv ance

Xola, I am a bit confused. Isn’t this the same problem you have at importClassCode using Renamed version of RooSimultaneous ? If not, please be more specific how their differ, otherwise avoid double posting as it makes it harder for us to keep track of the questions. Thanks.

Apologies. The other post evolved from loading shared libraries in the ROOT interpreter to creating shared libraries.

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.