Я пытался использовать ODB в моем проекте. Поэтому я использовал VS2015 для компиляции исходников Windows для их библиотек odb и odb-pgsql, выбрав конфигурацию Release и x64. Я связал библиотеки из моей стандартной установки postgres (предварительно скомпилированные двоичные файлы 64 бит).
Мой проект управляется cmake и 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;
}
Уже во время компиляции я получаю запутанные предупреждения.
Во время выполнения библиотеки 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. Я отладил приложение и вот мой стек вызовов.
Ошибка возникает только тогда, когда строка копируется в локальный user_
переменная от ::odb::pgsql::database
,
Если я углублюсь в назначение копирования, то увижу, что передаваемая строка из моего основного набора не настроена и указывает на 0x0, считывающее случайные значения из памяти.
Приложение выводит следующее на мой терминал.
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 и многобайтовый набор символов, но ничего не помогло. По крайней мере, используя amd64
Я не получил первые 5 предупреждений, упомянутых выше.
Помогает ли это изменить const std::string pg = "postgres";
в std::string pg = "postgres";
?
В противном случае это выглядит как проблема со связыванием (отредактируйте / удалите ответ, если это не поможет).
Других решений пока нет …