Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (GNU/Linux, *NIX, *BSD und Co) » CMakeList.txt für statische Libs... zu blöd für

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
20.02.2009, 11:53 Uhr
~shinji
Gast


Hallo!

ich würde gerne für ein etwas größeres Projekt cmake benutzen, komme aber momentan mit der CMakeLists.txt nicht klar. Die Struktur in meinem Projekt-Verzeichnis sieht grob so aus:


Code:
bin
src
|--- modul1
|    |-- mod1.cpp
|    |-- mod1.hpp
|--- modul2
|    |-- mod2.cpp
|    |-- mod2.hpp
|--- modul3
|    |-- mod3.cpp
|    |-- mod3.hpp
|--- modul4
|    |-- mod4.cpp
|    |-- mod4.hpp
|--- modul5
|    |-- mod5.cpp
|    |-- mod6.hpp
|--- main.cpp
|--- CMakeLists.txt



In meiner CMakeLists.txt habe ich die einzelnen Verzeichnisse mit "add_subdirectory()" eingetragen und in einer "target_link_libraries()" alle Libraries der einzelnen Module angegeben.


Code:
add_executable ( testprog main.cpp )
[...]
target_link_libraries ( testprog m libxml2 modul1 modul2 modul3 modul4 modul5 )    



In jedem Modul-Verzeichnis existiert eine weitere CMakeLists.txt Datei mit dem folgenden Eintrag:


Code:
add_library ( modulX SHARED modulX.cpp )



Das funktioniert mit SHARED super. Aber wenn ich ein STATIC draus mache kann der Linker später die einzelnen Teile (die aber schon als modul1.a statt modul1.o angelegt werden) nicht mehr zusammen führen da die ganzen Methoden in den Libraries nicht mehr gefunden werden. Also was ich machen möchte ist, entweder das Programm mit shared Libraries kompilieren, oder halt als ein großes statisches Programm das man so als Binärdatei weitergeben kann.

Ich bin aber auch zu blöd im Internet was brauchbares zu finden was mir weiter hilft.

Irgendjemand eine tolle Idee?

Gruß
Thorsten
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
20.02.2009, 12:14 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hi,

du solltest die cmake-Sachen groß schreiben (ist später lesbarer) und ansonsten gibt es noch den Befehl "LINK_DIRECTORIES" - in dem du angeben kannst, wo er nach Bibliotheken suchen soll. imho gibts das auch als "TARGET_LINK_DIRECTORIES" um es für bestimmte targets anzugeben.

Weiterhin ist es sinnvoll, eigene Bibliotheken zuerst anzugeben, und dann erst die "externen" - sonst spinnt cmake teilweise mit den Pfaden (evtl reicht die Reihenfolgeänderung schon aus damit ers "checkt")

Ansonsten poste einfach mal deine CMakeLists.txt und eine aus den Unterverzeichnissen

Außerdem ist wichtig: cmake 2.4 oder 2.6? 2.6 ist deutlich mächtiger


Bearbeitung:

Nachtrag:

Siehe hier: www.cmake.org/pipermail/cmake/2007-June/014386.html

Gib zu deinen eigenen Libraries ggf. die kompletten Pfade an, dann findet ers auch



--
class God : public ChuckNorris { };

Dieser Post wurde am 20.02.2009 um 12:16 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
20.02.2009, 19:54 Uhr
shinji



So, also das sieht in etwa so aus. Habe eben noch viel rumgefrickelt....


Code:
cmake_minimum_required (VERSION 2.4)
project (TEST)

OPTION(ENABLE_GPROF "Aktiviere gprof Profiling (-pg Option)" OFF)
OPTION(DEBUG_BUILD "Kompiliere im Debug Modus" ON)
OPTION(VERBOSE "Ausfuehrliche Ausgabe des Makefiles" OFF)
OPTION(MAKESTATIC "Libraries statisch einbinden" OFF)

if(COMMAND cmake_policy)
    cmake_policy(SET CMP0003 NEW)
endif(COMMAND cmake_policy)

SET(ADDITIONAL_MAKE_CLEAN_FILES Makefile CMakeCache.txt CMakeFiles cmake_install.cmake)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${TEST_SOURCE_DIR}/../bin)
SET(CMAKE_CXX_FLAGS "-W -Wall -Wshadow -Wunused -Wno-system-headers -Wold-style-cast -Wextra -Woverloaded-virtual -pedantic")
SET(CMAKE_CXX_FLAGS_DEBUG "-g -W -Wall -Wshadow -Wunused -Wno-system-headers -Wold-style-cast -Wextra -Woverloaded-virtual -pedantic")

IF(VERBOSE)
    SET(CMAKE_VERBOSE_MAKEFILE ON)
ELSE(VERBOSE)
    SET(CMAKE_VERBOSE_MAKEFILE OFF)
ENDIF(VERBOSE)

IF(ENABLE_GPROF)
    MESSAGE(STATUS "=======> Profiling wurde aktiviert! <=======")
    SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g -pg")
    SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -g -pg")
    SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -pg")
    SET(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -g -pg")
ELSE(ENABLE_GPROF)
    MESSAGE(STATUS "=======> Profiling wurde deaktiviert! <=======")
ENDIF(ENABLE_GPROF)

IF(DEBUG_BUILD)
    MESSAGE(STATUS "=======> Erzeuge Debug-Version <=======")
    SET(CMAKE_BUILD_TYPE "Debug" CACHE STRING "Debugmodus aktiv!")
    SET(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} "-ggdb")
ELSE(DEBUG_BUILD)
    MESSAGE(STATUS "=======> Erzeuge Release <=======")
    SET(CMAKE_BUILD_TYPE "Release" CACHE STRING "Release Version wird erzeugt!")
ENDIF(DEBUG_BUILD)


# FIND_PACKAGE(Boost 1.34 COMPONENTS program_options thread)
#IF(NOT Boost_FOUND)
    # MESSAGE(FATAL_ERROR "Benoetige mindestens die Boost Header in Version 1.34!")
#    MESSAGE(STATUS "Benoetige mindestens die Boost Header in Version 1.34!")
#ENDIF(NOT Boost_FOUND)

add_subdirectory(libdata)
add_subdirectory(libcom)
add_subdirectory(libmanager)
add_subdirectory(libctrl)
add_subdirectory(libstore)
add_subdirectory(libparse)
add_subdirectory(libtools)

add_executable ( TEST main/main.cpp )

#shared_libs
IF(MAKESTATIC)
        MESSAGE(STATUS "=======> Erzeuge Binary mit statischen Libraries <=======")
        SET(BUILD_SHARED_LIBS OFF)
        target_link_libraries( TEST
                data
                com
                manager
                ctrl
                store
                parse
                tools
                m
                xml2
                boost_thread
                )
ELSE(MAKESTATIC)
    target_link_libraries ( TEST
                data
                com
                manager
                ctrl
                store
                parse
                tools
                m
                xml2
                boost_thread
            )
ENDIF(MAKESTATIC)



Geht aber nicht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.02.2009, 09:30 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


und wie schaut eine deiner CMakeLists in den Librarys aus?

ansonsten schreib wie gesagt:


Code:
target_link_libraries ( TEST
                libdata/data
                libcom/com
                ...



bzw


Code:
LINK_DIRECTORIES("libdata" "libcom" ...)


--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.03.2009, 12:51 Uhr
shinji



Ha, es lag nur daran das die Libraries in der falschen Reihenfolge aufgelistet waren. Hab jetzt zwei vertauscht und jetzt geht es
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (GNU/Linux, *NIX, *BSD und Co) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: