2016-01-29 4 views
0

Я попытался использовать ODB в своем проекте. Поэтому я использовал VS2015 для компиляции источников Windows для их библиотеки odb и odb-pgsql, выбрав конфигурацию Release и x64. Я связал библиотеки со своей стандартной установкой postgres (готовые двоичные файлы 64 бит).ODB С PostgresSQL bad_alloc Exception

Мой проект управляется cmake и QtCreator. Вот настройка компилятора из набора, который я использую.

kit configuation in QtCreator

Я создал очень простой проект, который воспроизводит ошибку. Вот CMakeLists.txt

project(minimal_odb CXX) 
INCLUDE_DIRECTORIES(
    "C:/Users/micha/Downloads/libodb-2.4.0/libodb-2.4.0/" 
    "C:/Users/micha/Downloads/libodb-pgsql-2.4.0/libodb-pgsql-2.4.0/") 
add_executable(exec main.cpp) 
target_link_libraries(exec 
    "C:/Users/micha/Downloads/libodb-2.4.0/libodb-2.4.0/lib64/odb.lib" 
    "C:/Users/micha/Downloads/libodb-pgsql-2.4.0/libodb-pgsql-2.4.0/lib64/odb-pgsql.lib") 

Запуск cmake напечатает использованный компилятор.

-- The CXX compiler identification is MSVC 19.0.23506.0 
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe 
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/x86_amd64/cl.exe -- works 
-- Detecting CXX compiler ABI info 
-- Detecting CXX compiler ABI info - done 
-- Detecting CXX compile features 
-- Detecting CXX compile features - done 

здесь main.cpp

#include "odb/pgsql/database.hxx" 

int main() { 
    const std::string pg = "postgres"; 
    ::odb::pgsql::database db(pg, pg, pg, pg, 0); 
    return 0; 
} 

Уже в compiliation я запутанные предупреждения.

compiler warnings

Во время выполнения библиотеки DLL находятся из модифицированного пути environemt

C:\Users\micha\Downloads\libodb-2.4.0\libodb-2.4.0\bin64; 
C:\Users\micha\Downloads\libodb-pgsql-2.4.0\libodb-pgsql-2.4.0\bin64 

Однако моя программа немедленно завершается с исключением bad_alloc. Я отлаживал приложение, и вот мой стек вызовов.

callstack during debugging

Ошибка возникает только тогда, когда строка копируется в локальную переменную user_ от ::odb::pgsql::database.

Если я пойду глубже в присваивание копии, я вижу, что переданная строка из моего основного не настроена и указывает на 0x0, считывая случайные значения из памяти.

stack values in assign operation

печатает приложение следующее моего терминала.

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at f:\dd\vctools\crt\vcstartup\src\heap\throw_bad_alloc.cpp:33 

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at f:\dd\vctools\crt\vcstartup\src\heap\throw_bad_alloc.cpp:33 

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) at c:\program files (x86)\microsoft visual studio 14.0\vc\include\xstring:2185 

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) (first chance) in ntdll!RcConsolidateFrames 

Exception at 0x7ffd148d1f08, code: 0xe06d7363: C++ exception, flags=0x1 (execution cannot be continued) in ntdll!RcConsolidateFrames 

Я не удивляюсь получать bad_alloc с этой _Num значение а, но мне интересно, почему моя строка перепутались. Я пробовал какой-то другой компилятор, такой как amd64 и скомпилированный odb, odb-pgsql, используя набор символов UNICODE и Multi-Byte, но ничего не помогло. По крайней мере, используя amd64, я не получил первые 5 предупреждений, упомянутых выше.

Любой человек может мне помочь? :(

ответ

0

Помогает ли это изменить const std::string pg = "postgres"; к std::string pg = "postgres";?

В противном случае это выглядит как проблема связывания. (Будет ли редактировать/удалить ответ, если это не поможет)