簡體   English   中英

未定義對 soci::session::get_last_insert_id 的引用

[英]undefined reference to soci::session::get_last_insert_id

因此,我從 souceforge 下載了 soci 4.0.0 並將其解壓縮到 /tmp/ 中。 然后:

cd /tmp/soci-4.0.0
mkdir build
cd build
cmake -G "Unix Makefiles" -DWITH_BOOST=OFF -DWITH_ORACLE=OFF -DSOCI_TESTS=ON -DWITH_SQLITE3=ON -DSOCI_SQLITE3_TEST_CONNSTR="test.db" ../
make
make test

我得到了:

Running tests... Test project /tmp/soci-4.0.0/build
    Start 1: soci_empty_test 1/6 Test #1: soci_empty_test ..................   Passed    0.00 sec
    Start 2: soci_empty_test_static 2/6 Test #2: soci_empty_test_static ...........   Passed    0.00 sec
    Start 3: soci_postgresql_test 3/6 Test #3: soci_postgresql_test .............***Failed    0.01 sec
    Start 4: soci_postgresql_test_static 4/6 Test #4: soci_postgresql_test_static ......***Failed    0.01 sec
    Start 5: soci_sqlite3_test 5/6 Test #5: soci_sqlite3_test ................   Passed    1.30 sec
    Start 6: soci_sqlite3_test_static 6/6 Test #6: soci_sqlite3_test_static .........   Passed    1.28 sec

67% tests passed, 2 tests failed out of 6

Total Test time (real) =   2.61 sec

The following tests FAILED:
          3 - soci_postgresql_test (Failed)
          4 - soci_postgresql_test_static (Failed) Errors while running CTest make: *** [Makefile:86: test] Chyba 8

我不關心 posgresql 失敗(可能缺少一些開發文件)

但后來我嘗試編譯這個 socitest.cpp 文件:

#include <soci/soci.h>
#include <soci/sqlite3/soci-sqlite3.h>
#include <exception>
#include <iostream>
#include <string>
#include <memory>


int main() {
                std::string   dbname=":memory:";
                soci::session sql(soci::sqlite3, dbname);

                std::cout << "ok" << std::endl;
                sql.once << "create table test(id integer primary key AUTOINCREMENT, s text);";
                std::cout << "created" << std::endl;
                sql.begin();
                sql.once << "insert into test(s) values(:s)", soci::use(dbname);
                std::cout << "inserted" << std::endl;
                sql.once << "insert into test(s) values(:s)", soci::use(dbname);
                long id = 0;
                if(!sql.get_last_insert_id("test", id)) {
                        std::cout << "cannot get last inserted id" << std::endl;
                }
                std::cout << "inserted id = " << id << std::endl;

                int i;
                soci::statement st = (sql.prepare << "select last_insert_rowid();", soci::into(i));
                st.execute();
                while (st.fetch())
                {
                        std::cout << i << '\n';
                }

                sql.commit();
                return 0;
}
g++ -std=c++14 -o socitest socitest.cpp -I../include/soci/ -I ../include/private/ -I/usr/include/  -L./lib -L/usr/lib/x86_64-linux-gnu  -lsoci_core -lsoci_sqlite3 -lsqlite3 -ldl 

我得到了這個錯誤:

/usr/bin/ld: /tmp/ccwEUoUG.o: in function main': socitest.cpp:(.text+0x272): undefined reference to soci::session:::std_last_insert::basicst_string::get_last_insert::basicst_xx( ::allocator > const&, long&)' collect2: error: ld returned 1 exit status

當我注釋掉

if(!sql.get_last_insert_id("test", id)) {
        std::cout << "cannot get last inserted id" << std::endl;
}

我可以編譯程序,但運行后我得到了 SIGSEGV:

LD_LIBRARY_PATH=lib ./socitest
ok
created
Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])

我做錯了什么?

我發現了錯誤。

代替

g++ -std=c++14 -o socitest socitest.cpp -I../include/soci/ -I../include/private/ -I/usr/include/ -L./lib -L/usr/lib /x86_64-linux-gnu -lsoci_core -lsoci_sqlite3 -lsqlite3 -ldl

它應該是

g++ -std=c++14 -o socitest socitest.cpp -I../include/ -I./include/ -I/usr/include/ -L./lib -lsoci_core -lsoci_sqlite3 -lsqlite3 -ldl

首先,我包括#include <soci/soci.h> ,因此-I應該是../include/ 而不是../include/soci/

我還在系統中安裝了 soci v 3,所以 g++ 在 /usr/lib/x86_64-linux-gnu 中找到舊的頭文件和舊庫,並以某種方式將頭文件和庫與 v 4 混合在一起,並導致在問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM