Shared Lib und Testapplikation



  • Hallo!

    Es geht um C++ in Zusammenhang mit CMake. Da es eher C++ ist, habe ich dieses
    Forum gewählt: Ich compiliere eine eigene Library mit Hilfe von CMake, wobei
    in der CMakeLists.txt, das hier verwendet wird:

    add_definitions(-O3 -Wextra -Wunused -Wall -ansi -pedantic-errors -frounding-math -g )

    Wird nun die Test-Applikation, die diese Library verwendet, mit den gleichen
    Optionen compiliert, so funktioniert sie. Verwende ich aber für die Applikation

    add_definitions(-O3 -Wextra -Wunused -Wall -ansi -pedantic-errors -frounding-math -DNDEBUG )

    so gibt es Segfaults, und das hängt sicher nicht mit den Assertions zusammen.
    Mir scheint, daß der Code dann inkompatibel wird. Kann es sein, daß ich da
    noch Compiler-/Linkerflags wie -fPIC oder andere benötige?

    Hier folgt die gesamte CMakeLists.txt für die Library. Jeder Hinweis wird
    dankend angenommen. Ich starte gerade erst mit CMake.

    cmake_minimum_required(VERSION 2.6)
    
    # Name of the project 
    project(FD_2D)
    
    set(CMAKE_VERBOSE_MAKEFILE ON)
    
    # Find boost
    FIND_PACKAGE( Boost COMPONENTS program_options filesystem system REQUIRED )
    INCLUDE_DIRECTORIES( ${Boost_INCLUDE_DIR} )
    
    add_definitions(-O3 -Wextra -Wunused -Wall -ansi -pedantic-errors -frounding-math -g )
    
    set(LIB_SRC HCube2.cpp FD_2D.cpp Circle2.cpp Label.cpp Segment2.cpp ExactTest.cpp tools.cpp Color.cpp Dt2.cpp Vis2.cpp )
    add_library(fd2d SHARED ${LIB_SRC})
    
    TARGET_LINK_LIBRARIES( dt2 ${Boost_LIBRARIES} )
    
    # install library
    INSTALL( TARGETS fd2d DESTINATION lib PERMISSIONS
    	OWNER_READ OWNER_WRITE OWNER_EXECUTE
    	GROUP_READ GROUP_EXECUTE
    	WORLD_READ WORLD_EXECUTE 
    	)
    
    # install headers
    INSTALL(FILES Point2.h Triangle2.h TaVeIt.h Vis2.h FD_2D.h common.h tools.h Circle2.h Segment2.h Color.h Label.h Bbox2.h
    	DESTINATION include/gm
            PERMISSIONS OWNER_READ GROUP_READ WORLD_READ
    	)
    

    Danke, lg



  • NDEBUG steuert nicht nur Assertions. Ggf. hast du Header in der Lib, die mit NDEBUG ein anderes binäres Layout erzeugen, z.B. durch irgendwelche #ifdefs. Oder der Compiler macht das von sich aus, weil er mit NDEBUG anders arbeitet. Du müsstest von der Lib dann debug und release-Versionen haben, und je nach NDEBUG gegen die passende linken.



  • pumuckl schrieb:

    NDEBUG steuert nicht nur Assertions. Ggf. hast du Header in der Lib, die mit NDEBUG ein anderes binäres Layout erzeugen, z.B. durch irgendwelche #ifdefs. Oder der Compiler macht das von sich aus, weil er mit NDEBUG anders arbeitet. Du müsstest von der Lib dann debug und release-Versionen haben, und je nach NDEBUG gegen die passende linken.

    Das war ein Super-Volltreffer, danke! Ich hatte

    class Triangle
    {
    ...bla
    #ifndef NDEBUG
            unsigned debug_triangleLabel;
    #endif
    ...bla
    };
    

    in einem Header. Das hätte ich wohl noch sehr lange gesucht.

    Schönen Tag! / lg


Anmelden zum Antworten