Page 1 of 1

[Solved] Linux CMake can't find CEGUI, no matter what I try

Posted: Fri Apr 17, 2015 21:04
by Dugi
Hello,

I wanted to use CEGUI with my ogre-based program, but I could not get CMake to find it. I have found several solutions via google on these forums and also elsewhere, but neither of them worked, CMake was still failing to find it (the errors varied).

The one that was closest to success was at axelschumacher.fr/218/link-ogre-with-cegui-ogre-basic-tutorial-7-using-cmake , but it was still throwing the following error:

Code: Select all

CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:108 (message):
  Could NOT find CEGUI (version requirements: at least ) (missing:
  CEGUI_LIBRARY_OPTIMIZED)
Call Stack (most recent call first):
  /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:315 (_FPHSA_FAILURE_MESSAGE)
  /usr/local/lib/cegui-0.8/cmake/FindPackageHandleAdvancedArgs.cmake:44 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  /usr/local/lib/cegui-0.8/cmake/FindCEGUI.cmake:59 (FIND_PACKAGE_HANDLE_ADVANCED_ARGS)
  CMakeLists.txt:111 (find_package)

I don't know why does that happen, I tried to remove CEGUI_LIBRARY_OPTIMIZED from the targets list, but it started complaining about being unable to find CEGUIOGRE and I found no haphazard trick to get over it. I remember that I got some 0.7.something version of CEGUI working about 1.5 years ago using exactly those scripts, but I was doing it just for an Ogre tutorial and lost the files due in an accident. Maybe something changed since then

I am using Linux Ubuntu 14.10, Ogre was compiled from source and has all the CMake files there, compiles correctly, CEGUI was compiled without issues (default installation), the CEGUIOGRE based samples' framework runs. According to cegui.org.uk/forum/viewtopic.php?f=10&t=6693 , the way Ogre installed isn't good. I am quite sure that findCEGUI.cmake and other files were found, the error is different if I remove them.

I have CEGUI installed in /usr/local/lib/cegui-0.8 and /usr/local/include/cegui-0/CEGUI (default location when compiling), to be sure that it's not just misplaced I placed links on these folders into /usr/lib/ and /usr/include but it did not help.

I also tried the script on cegui.org.uk/forum/viewtopic.php?f=3&t=5732 , but it generated a large number of errors and failed to find it anyway (I can post these too if necessary).

Any idea what am I doing wrong? CEGUI looks like a pretty cool library and I would like to be able to use it.

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sat Apr 18, 2015 14:36
by Ident
Can you paste the cmake find file that was closest to success?

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sat Apr 18, 2015 19:49
by Dugi
Thanks for the reply.

It was in the first link (http://www.axelschumacher.fr/218/link-o ... ing-cmake/), but as I see, it's better to post it all here.

The file is:

Code: Select all

INCLUDE(DetermineVersion)
INCLUDE(FindPackageHandleAdvancedArgs)
INCLUDE(HandleLibraryTypes)

FIND_PATH(CEGUI_INCLUDE_DIR CEGUI.h
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES /include /cegui/include /include/CEGUI CEGUI.framework/Headers
)

FIND_LIBRARY(CEGUI_LIBRARY_OPTIMIZED
  NAMES CEGUIBase CEGUI
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES lib bin
)
FIND_LIBRARY(CEGUI_LIBRARY_DEBUG
  NAMES
    CEGUIBased CEGUIBase_d CEGUIBaseD CEGUIBase_D
    CEGUId CEGUI_d CEGUID CEGUI_D
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES lib bin
)


# Inspect CEGUIVersion.h for the version number
DETERMINE_VERSION(CEGUI ${CEGUI_INCLUDE_DIR}/CEGUIVersion.h)

# Handle the REQUIRED argument and set CEGUI_FOUND
# Also checks the version requirements if given
FIND_PACKAGE_HANDLE_ADVANCED_ARGS(CEGUI DEFAULT_MSG "${CEGUI_VERSION}"
  CEGUI_LIBRARY_OPTIMIZED
  CEGUI_INCLUDE_DIR
)

# Collect optimized and debug libraries
HANDLE_LIBRARY_TYPES(CEGUI)

MARK_AS_ADVANCED(
  CEGUI_INCLUDE_DIR
  CEGUI_LIBRARY_OPTIMIZED
  CEGUI_LIBRARY_DEBUG
)


For CEGUIOGRE:

Code: Select all

INCLUDE(DetermineVersion)
INCLUDE(FindPackageHandleAdvancedArgs)
INCLUDE(HandleLibraryTypes)

FIND_PATH(CEGUIOGRE_INCLUDE_DIRS CEGUIOgreRenderer.h
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES include/RendererModules/Ogre cegui/include/RendererModules/Ogre include/CEGUI/RendererModules/Ogre CEGUI.framework/Headers
)
FIND_LIBRARY(CEGUIOGRE_LIBRARY_OPTIMIZED
  NAMES CEGUIOgreRenderer CEGUI
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES lib bin
)
FIND_LIBRARY(CEGUIOGRE_LIBRARY_DEBUG
  NAMES
  CEGUIOgreRendererd CEGUIOgreRenderer_d CEGUIOgreRendererD CEGUIOgreRenderer_D
  PATHS $ENV{CEGUIDIR}
  PATH_SUFFIXES lib bin
)

# Collect optimized and debug libraries
HANDLE_LIBRARY_TYPES(CEGUIOGRE)

FIND_PACKAGE_HANDLE_ADVANCED_ARGS(CEGUIOGRE DEFAULT_MSG
  CEGUIOGRE_LIBRARY_OPTIMIZED
  CEGUIOGRE_INCLUDE_DIRS
)

MESSAGE(STATUS "Found CEGUI include dir: ${CEGUIOGRE_INCLUDE_DIRS}")

MARK_AS_ADVANCED(
  CEGUIOGRE_INCLUDE_DIRS
  CEGUIOGRE_LIBRARY_OPTIMIZED
  CEGUIOGRE_LIBRARY_DEBUG
)


It depends on files CompareVersionStrings.cmake, HandleLibraryTypes.cmake, DetermineVersion.cmake and FindPackageHandleAdvancedArgs.cmake, they are in this repo (https://bitbucket.org/sumwars/sumwars-c ... keModules/).

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sat Apr 18, 2015 20:35
by Ident

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sat Apr 18, 2015 21:14
by Dugi
Thanks for the reply. That file seems to do the trick for CEGUI, but not for CEGUIOGRE. I assumed that the file checks for that too and the script parts looking for CEGUIOGRE separately are unneeded, but it results in linker errors without them.

This is the new error:

Code: Select all

By not providing "FindCEGUIOGRE.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "CEGUIOGRE", but CMake did not find one. Could not find a package configuration file provided by "CEGUIOGRE" with any of the following names: CEGUIOGREConfig.cmake ceguiogre-config.cmake Add the installation prefix of "CEGUIOGRE" to CMAKE_PREFIX_PATH or set "CEGUIOGRE_DIR" to a directory containing one of the above files.  If "CEGUIOGRE" provides a separate development package or SDK, be sure it has been installed.


I thought this line cares for it, but if it does, I am using it wrong:

Code: Select all

cegui_register_module(RENDERER OgreRenderer RendererModules/Ogre/Renderer.h "OGRE")


I tried to check that folder for a file like FindCEGUIOGRE.cmake, but I found nothing that looked like what I am looking for. Using the FindOgre.cmake file from the repository did not help.

This is what I am using in my CmakeLists.txt:

Code: Select all

find_package(CEGUI REQUIRED)
if(NOT CEGUI_FOUND)
message(SEND_ERROR "Failed to find CEGUI.")
endif()

find_package(CEGUIOGRE REQUIRED)
if(NOT CEGUIOGRE_FOUND)
message(SEND_ERROR "Failed to find CEGUIOGRE.")
endif()

#...

include_directories( #...
   ${CEGUI_INCLUDE_DIRS}
   ${CEGUIOGRE_INCLUDE_DIRS}
)

# Adding ${CEGUI_LIBRARY} ${CEGUIOGRE_LIBRARY_OPTIMIZED} to the list of linked libraries

I am quite convinced that I am doing something silly somewhere. Any idea what could be the cause of the problem now?

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sat Apr 18, 2015 22:19
by Kulik
Read the docs of the FindCEGUI script Ident posted. You don't need CEGUIOGRE.

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Sun Apr 19, 2015 12:39
by Dugi
Good to know that. Thanks.

But what do I use as argument for target_link_libraries without seeing linker errors? I guessed that $(CEGUI_LIBRARIES) should be there, but I could not find anything for ceguiogre. I tried $(CEGUI_OGRE_RENDERER_LIBRARIES), ${CEGUI_RENDERER_OGRE_LIBRARIES}, ${CEGUI_OGRE_LIBRARIES}, ${CEGUI_RENDERER_LIBRARIES}, ${CEGUI_OGRE_RENDERER_LIBNAME}, ${CEGUI_OGRE_RENDERER_LIBS} or just $(CEGUI_LIBRARIES) alone, but it did not help.

I believe that the answer lies somewhere in this section, where TYPE is RENDERER, LIBNAME is OgreRenderer, HEADER is RendererModules/Ogre/Renderer.h and PKGCONGIG is "OGRE":

Code: Select all

macro(cegui_register_module TYPE LIBNAME HEADER PKGCONFIG)
        set(CEGUI_MODULES ${CEGUI_MODULES} ${LIBNAME})
        set(CEGUI_${TYPE}_MODULES ${CEGUI_${TYPE}_MODULES} ${LIBNAME})
        set(CEGUI_${TYPE}_MODULES_${LIBNAME}_HEADER ${HEADER})
        if(NOT "${PKGCONFIG}" STREQUAL "")
            set(CEGUI_${TYPE}_MODULES_${LIBNAME}_PKGCONFIG ${PKGCONFIG})
        endif()
endmacro()

But I found nothing. It was hard to look for definitions of those variables because of the macros. Even the macros in the samples' framework directory are very complicated and it's hard to tell what do I need to get it working with Ogre.

So I am still stuck at linker errors (for testing, I have just this line related to CEGUI in code):

Code: Select all

error: undefined reference to `CEGUI::OgreRenderer::bootstrapSystem(int)'


Maybe there should be some kind of linking documentation for dummies section. Please, what should I add to the target_link_libraries arguments to add OgreRenderer?

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Mon Apr 20, 2015 09:44
by Kulik
just run:

Code: Select all

cmake -LA


to list all cmake vars available. Or see the documentation.

Re: Linux CMake can't find CEGUI, no matter what I try

Posted: Mon Apr 20, 2015 10:41
by Dugi
Ehm, that's quite a dirty solution. Like placing the library into the same folder as the executable and adding links exactly to that file. However, it led me to the solution I was looking for.

I was trying to google how to add that to the CMakeLists.txt file, and I found a way to print all defined variables. Automated search has found that the variable I needed to see is $(CEGUI_OgreRenderer_LIBRARIES). Now it works.

Thanks for all the help.

Re: [Solved] Linux CMake can't find CEGUI, no matter what I

Posted: Mon Apr 20, 2015 13:47
by Kulik
I don't understand. What I suggested is a perfectly clean solution. You use cmake -LA to list all variables defined in your project. Your project uses FindCEGUI which means it will contain variables defined by this script as well. cmake -LA lets you see all these variables so that you can choose the right one :-)

This is what you do when the find script does not provide any documentation.

No cmake file editing was necessary.

Re: [Solved] Linux CMake can't find CEGUI, no matter what I

Posted: Mon Apr 20, 2015 15:16
by Dugi
Ah, I didn't get it. I thought that it will just try to link anything linkable defined. I see it now. That -LA trick will be very handy in the future. Thanks.

Re: [Solved] Linux CMake can't find CEGUI, no matter what I try

Posted: Wed Jan 25, 2017 04:37
by syedharoonalam
Adding ${CEGUI_OgreRenderer_LIBRARIES} or -lCEGUIOgreRenderer-0 in target_link_libraries worked for me.