0

我试图在我的项目中使用 ODB。因此,我使用 VS2015 为他们的 odb 和 odb-pgsql 库编译 Windows 源代码,选择 Release 和 x64 配置。我从我的标准 postgres 安装(预构建的二进制文件 64 位)中链接了这些库。

我的项目由 cmake 和 QtCreator 管理。这是我使用的套件中的编译器设置。

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;
}

在编译期间,我已经收到令人困惑的警告。

编译器警告

在运行时,从修改后的路径 environemt 中找到 DLL

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

如果我更深入地研究复制分配,我可以看到我的 main 传递的字符串没有真正设置,并且指向 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使用 UNICODE 和多字节字符集编译 odb、odb-pgsql,但没有任何帮助。至少使用amd64我没有得到上面提到的前 5 个警告。

4

1 回答 1

0

改成 有帮助const std::string pg = "postgres";std::string pg = "postgres";

否则它看起来像一个链接问题。(如果这没有帮助,将编辑/删除答案)

于 2016-02-04T11:02:21.680 回答