Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

18.07.2013, 13:19

Verzeichnisstruktur für externe Bibliotheken

Hallo zusammen,

für ein C++-Projekt überlege ich gerade, wie man das Verzeichnis für externe Bibliotheken am besten organisieren könnte. Hauptsächlich geht es mir darum, die verwendeten Bibliotheken für unterschiedliche Plattformen und Compiler zu hinterlegen.

Bisher habe ich nur Header-Bibliotheken in das Libs-Verzeichnis gesteckt und den Rest über symbolische Links gelöst. Allerdings ist das für die Versionsverwaltung nicht ganz so optimal.

Für eine beispielhafte Verzeichnisstruktur ziehe ich an dieser Stelle einfach mal SFML als Bibliothek heran.

Auf der Downloadseite von SFML werden folgende Ausführungen der Bibliothek für Windows angeboten:

  • Visual C++ 9 (2008 ) - 32 bits
  • Visual C++ 10 (2010) - 32 bits
  • Visual C++ 11 (2012) - 32 bits
  • GCC 4.7 TDM (SJLJ) - 32 bits
  • GCC 4.7 MinGW (DW2) - 32 bits
  • Visual C++ 9 (2008 ) - 64 bits
  • Visual C++ 10 (2010) - 64 bits
  • Visual C++ 11 (2012) - 64 bits
  • GCC 4.7 TDM (SJLJ) - 64 bits
Dementsprechend würde ich das Libs-Verzeichnis folgendermaßen aufbauen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
libs
    - include
        - SFML
    - win32
        - vs2012
            - SFML
                - bin
                - lib
        - gcc-4.7-tdm-sjlj
            - SFML
                - bin
                - lib
        - gcc-4.7-mingw-dw2
            - SFML
                - bin
                - lib
    - win64
        - ...


Ist das in Ordnung so oder müsste ich noch andere Sachen beachten?

Thoran

Alter Hase

Beiträge: 520

Wohnort: Stuttgart

Beruf: Senior Software Engineer

  • Private Nachricht senden

2

18.07.2013, 14:37

Ich halte das wie folgt:
Es gibt ein Verzeichnis externlibs für win32, da liegen alle externen Bibliotheken mit entsprechender Unterverzeichnisstruktur drin gegen die ich linke. Für linux gibt es auch wieder so ein Verzeichnis, genauso wie es wohl irgendwann eins für x64 geben wird. Dannsetze ich immer auf einem Dev-System eine Umgebungsvariable damit mein Buildsystem die libs findet.

Beispiel:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
SET EXTERNLIBS=d:\externlibs32

d:\externlibs32
  - ogg
      -bin
      -lib
      -include
  - vorbis
      -bin
      -lib
      -include
Mein Entwicklertagebuch
Aktuelles Projekt: Universum Espionage
Eingestellt:Spieleengine SilverCore
Organisator "Spieleentwickler Stammtisch Stuttgart"

3

20.07.2013, 14:48

So ähnlich schaut es momentan auch bei mir aus: Ich habe ein Verzeichnis D:\Libs\, in dem meine ganzen Bibliotheken liegen. Innerhalb meines C++-Projekts habe ich ein Verzeichnis paths, in dem sich die symbolischen Links auf die Bibliotheken in dem erstgenannten Verzeichnis befinden. Ich bin gar nicht darauf gekommen, dass ich das auch mit Umgebungsvariablen hätte lösen können. In diesem Fall ist es vermutlich aber auch einerlei.

Ich dachte, es sei praktischer, wenn sich alles in meinem Repository befände, was zum Bauen des Projekts notwendig ist. Dann könnte man einfach Auschecken und direkt losbauen. Im Repo von SFML sind ja beispielsweise auch die DLLs für libsndfile und OpenAL versioniert, sowohl für 32 Bit als auch 64 Bit.

Oder wäre es im Falle von SFML besser, wenn ich stattdessen einfach auf das mitgelieferte Script FindSFML.cmake zurückgreife?

4

22.07.2013, 12:32

Ich habe mir nun das komplette SFML-Repo geschnappt und unverändert in das Libs-Verzeichnis meines Projekts eingefügt.

Mithilfe von CMake und diesem Tutorial war es auf diese Weise ziemlich einfach, SFML direkt in meinen Build-Prozess zu integrieren:

(CMakeLists.txt im Libs-Verzeichnis)

Quellcode

1
2
3
4
5
6
7
8
set(BUILD_SHARED_LIBS OFF)
add_subdirectory(SFML-2.0)

target_compile_definitions(sfml-audio PUBLIC SFML_STATIC)
# sfml-graphics, sfml-system, sfml-window ...

target_include_directories(sfml-audio PUBLIC ${CMAKE_CURRENT_LIST_DIR}/SFML-2.0/include)
#...


(CMakeLists.txt des Spiels)

Quellcode

1
target_link_libraries(Einherjer sfml-window sfml-system sfml-graphics sfml-audio)


So werde ich es auch mit den anderen Bibliotheken machen. Dadurch ist alles versionierbar und ich muss keine system- oder compilerspezifischen DLLs mitliefern.

Werbeanzeige