SQLite Wrapper gesucht



  • @Swordfish sagte in SQLite Wrapper gesucht:

    cmake -S . -B build -DWITH_SQLite3=ON -DWITH_BOOST=OFF

    Die Fehlermeldung bleibt leider



  • @Zhavok schade.



  • Das sind doch nur Warnungen, keine Fehler.

    -- Building for: Visual Studio 16 2019
    ...
    -- Build files have been written to: C:/CPP/Additional Includes/soci/build

    Ist denn dort keine Projektdatei für VS 2019 (*.sln bzw. *.vcproj)?
    s.a. SOCI Installation "Running CMake on Windows", d.h. noch msbuild.exe SOCI.sln aufrufen.



  • Doch ist es und ich habs gleich via

    cmake --build build
    

    gebaut.
    Bis auf paar Warnungen und Linkerfehler ist es auch komplett durchgelaufen und alle targets wurden gebaut. Fande die Fehlermeldung jetzt trotzdem etwas beunruhigend. Kann ja morgen noch mal schreiben wo ich danach Probleme hatte.



  • Nachdem ich also wie geschrieben soci gebuilded hatte, hab ichs erstmal ganz simpel versucht an einem Testprojekt und dazu sah mein CMake-Script so aus:

    cmake_minimum_required(VERSION 3.17)
    
    project(SqliteTest)
    
    add_executable(SqliteTest)
    add_subdirectory(src)
    
    find_package(Soci)
    target_link_libraries(SqliteTest soci_core soci_sqlite3)
    

    Ich bekam den Fehler:

    "soci/soci.h": No such file or directory 
    

    weshalb ich noch noch target_include_directories ergänzte:

    cmake_minimum_required(VERSION 3.17)
    
    project(SqliteTest)
    
    add_executable(SqliteTest)
    add_subdirectory(src)
    
    
    find_package(Soci)
    target_include_directories(SqliteTest PUBLIC "C:/CPP/Additional Includes/soci/include")
    target_link_libraries(SqliteTest soci_core soci_sqlite3)
    

    Daraufhin bekam ich dann die Fehlermeldung:

    "sqlite3.h": No such file or directory
    

    Draufhin ergännzte ich also noch target_include_directories für SQLite:

    cmake_minimum_required(VERSION 3.17)
    
    project(SqliteTest)
    
    add_executable(SqliteTest)
    add_subdirectory(src)
    
    
    find_package(Soci)
    target_include_directories(SqliteTest PUBLIC "C:/CPP/Additional Includes/soci/include")
    target_include_directories(SqliteTest PUBLIC "C:/CPP/Additional Includes/SQLite3/include")
    target_link_libraries(SqliteTest soci_core soci_sqlite3)
    

    Ins stocken gekommen bin ich dann beim linken durch den Fehler:

    LINK : fatal error LNK1104: Datei "soci_core.lib" kann nicht geöffnet werden.
    

    Obwohl die soci_core.lib eigentlich vorhanden ist in "C:\CPP\Additional Includes\soci\build\lib\Debug".
    Schön ist das Ganze aber so oder so nicht, da ich eigentlich keine absoluten Pfade in CMake mag^^.



  • @Zhavok sagte in SQLite Wrapper gesucht:

    Obwohl die soci_core.lib eigentlich vorhanden ist in "C:\CPP\Additional Includes\soci\build\lib\Debug".

    Und woher soll der Linker das wissen?



  • Ich hätte gedacht, dass wenn find_package Soci findet, es beim linken doch dann auch die Unterverzeichnisse mit durchschauen müsste?



  • @Schlangenmensch hast du auf Arbeit noch etwas herausfinden kommen?



  • Sorry, ich bin gestern nicht dazu gekommen,

    wir bauen soci so (Debug Variante, Release analog):

    cmake -G "Visual Studio 15" ^
        -DWITH_BOOST=OFF ^
        -DWITH_BOOST=OFF ^
        -DSOCI_SHARED=OFF ^
        -DWITH_DB2=OFF ^
        -DWITH_FIREBIRD=OFF ^
        -DWITH_MYSQL=OFF ^
        -DWITH_ODBC=OFF ^
        -DWITH_ORACLE=OFF ^
        -DWITH_POSTGRESQL=OFF ^
        -DWITH_SQLITE3=ON ^
        -DSOCI_EMPTY=ON ^
        -DSOCI_DB2=OFF ^
        -DSOCI_FIREBIRD=OFF ^
        -DSOCI_MYSQL=OFF ^
        -DSOCI_ODBC=OFF ^
        -DSOCI_ORACLE=OFF ^
        -DSOCI_POSTGRESQL=OFF ^
        -DSOCI_SQLITE3=ON ^
        -DSQLITE3_INCLUDE_DIR=%sqlite_include_dir% ^
        -DSQLITE3_LIBRARY=%sqlite_library_path%\libsqlite3.lib ^
        -DCMAKE_INSTALL_PREFIX=%soci_install_path% %soci_download_path%
       
    cmake --build . --config Debug --target install
    

    Die Pfade musst du natürlich für dich korrekt setzen.



  • Vielen Dank 😁 👍🏻

    Ich teste es gleich morgen gebe Rückmeldung.



  • Also ich habs jetzt mal so gebuilded wie du geschrieben hast. Abgesehen von vereinzelten Warnungen bekomme ich beim linken den Fehler:

    libsoci_sqlite3_4_0.lib(statement.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "sqlite3_column_d
    ecltype" in Funktion ""public: virtual void __cdecl soci::sqlite3_statement_backend::describe_column(int,enum soci::dat
    a_type &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > &)" (?describe_column@
    sqlite3_statement_backend@soci@@UEAAXHAEAW4data_type@2@AEAV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@
    @@Z)". [C:\CPP\Additional Includes\soci\build\tests\sqlite3\soci_sqlite3_test_static.vcxproj]
    C:\CPP\Additional Includes\soci\build\bin\Debug\soci_sqlite3_test_static.exe : fatal error LNK1120: 1 nicht aufgelöste
    Externe [C:\CPP\Additional Includes\soci\build\tests\sqlite3\soci_sqlite3_test_static.vcxproj]
    

    ich erhalte danach in /lib/Debug die libsoci_core_4_0.lib, libsoci_empty_4_0.lib und libsoci_sqlite3_4_0.lib.
    Mein CMakeScript sieht jetzt wie folgt aus:

    cmake_minimum_required(VERSION 3.17)
    
    project(SqliteTest)
    
    add_executable(SqliteTest)
    add_subdirectory(src)
    
    find_package(Soci)
    target_include_directories(SqliteTest PUBLIC "C:/CPP/Additional Includes/soci/include")
    target_include_directories(SqliteTest PUBLIC "C:/CPP/Additional Includes/SQLite3/include")
    list(APPEND LIBS ${SOCI_LIBRARY} ${SOCI_sqlite3_PLUGIN})
    target_link_libraries(SqliteTest PUBLIC ${LIBS})
    

    Dabei erhalte ich dann ebenfalls einen Fehler beim Linken:

    Microsoft (R)-Build-Engine, Version 16.5.0+d4cbfca49 für .NET Framework
    Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.
    
      Checking Build System
      Building Custom Rule C:/CPP/Projects/SqliteTest/CMakeLists.txt
      main.cpp
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __cdecl soci::session::session(class soci::backend_factory const &,class std::basic_string<char,struct std::ch 
    ar_traits<char>,class std::allocator<char> > const &)" (??0session@soci@@QEAA@AEBVbackend_factory@1@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z)" in Funktion "main". [C 
    :\CPP\Projects\SqliteTest\build\SqliteTest.vcxproj]
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: __cdecl soci::session::~session(void)" (??1session@soci@@QEAA@XZ)" in Funktion "main". [C:\CPP\Projects\Sqlite 
    Test\build\SqliteTest.vcxproj]
    main.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: void __cdecl soci::session::close(void)" (?close@session@soci@@QEAAXXZ)" in Funktion "main". [C:\CPP\Projects\ 
    SqliteTest\build\SqliteTest.vcxproj]
    main.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""struct soci::sqlite3_backend_factory const soci::sqlite3" (?sqlite3@soci@@3Usqlite3_backend_factory@1@B)". [C:\CPP\Projects\Sqlite 
    Test\build\SqliteTest.vcxproj]
    C:\CPP\Projects\SqliteTest\build\Debug\SqliteTest.exe : fatal error LNK1120: 4 nicht aufgelöste Externe [C:\CPP\Projects\SqliteTest\build\SqliteTest.vcxproj]
    


  • Mal kurz eine andere Frage, wo hast du eine SQLite Version her? Ich habe da keinen klassichen "include" Ordner, sondern alles im "src" Ordner.

    Ansonsten gebe ich für meine Projekte dann die Include Ordner von SQlite Soci an (bei sqlite den src ordner) und linke gegen die sqlite und soci libs.

    Wir verwenden aber historisch gewachsen leider für unsere eigentlichen Projekte nicht CMake sondern premake5.



  • Habe einfach ein include-Verzeichnis erstellt und von https://www.sqlite.org/download.html sqlite-amalgamation runtergeladen und dort drin entpackt. Wie ich zu der .lib gekommen bin weiß ich gerade garnicht mehr genau. Habe soviel in der Zwischenzeit versucht und probiert, da müsste ich nochmal nachschauen. Das mit dem Include-Verzeichnis habe ich auch nur auf einer Website gelesen.

    Edit: hatte glaube das folgende für die .lib gemacht: https://gist.github.com/zeljic/d8b542788b225b1bcb5fce169ee28c55



  • Sieht halt irgendwie so aus, als ob er die SQLite lib nicht findet. Daher, vlt einfach noch mal die Pfade überprüfen?



  • Beim builden von soki findet er include und lib. Er schreibt die richtigen Pfade direkt als Message hin. Das einzige was halt komisch ist ist der oben genannte Fehler.

    Also:

    The package name passed to `find_package_handle_standard_args` (SQLITE3)
      does not match the name of the calling package (SQLite3).  This can lead to
      problems in calling code that expects `find_package` result variables
      (e.g., `_FOUND`) to follow a certain pattern.
    


  • @manni66 sagte in SQLite Wrapper gesucht:

    @Zhavok sagte in SQLite Wrapper gesucht:

    Obwohl die soci_core.lib eigentlich vorhanden ist in "C:\CPP\Additional Includes\soci\build\lib\Debug".

    Und woher soll der Linker das wissen?

    Wenn find_package(Soci) funktioniert hat, und es sich um ein "modernes" CMake Package handelt, dann sollte CMake wissen wo sich die .lib befindet und das entsprechend dem Linker mitteilen.

    target_link_libraries(SqliteTest soci_core soci_sqlite3) sollte ausreichend sein.

    Das ist ja gerade das schöne an CMake (*hust*), dass man sich eben nicht darum scheren muss welche Lib- und Include-Pfade man für irgendeine Library braucht.

    Genaugenommen sollte sogar target_link_libraries(SqliteTest soci_sqlite3) ausreichend sein, vorausgesetzt soci_sqlite3 benötigt soci_core.



  • @hustbaer genau so habe ich mir das auch vorgestellt. Funktioniert nur leider nicht so 😞


Anmelden zum Antworten