2.5.1构建连接器/ c++应用程序:一般考虑

本节讨论构建Connector/ c++应用程序时应注意的一般事项。有关适用于特定平台的信息,请参阅中适用于您的平台的部分第2.5.2节,“构建连接器/ c++应用程序:特定于平台的注意事项”

这里显示的命令是从命令行给出的(例如,从Makefile).这些命令适用于支持使和命令行构建工具,例如g + +cc,或铿锵声,但可能需要根据您的构建环境进行调整。

构建工具和配置设置

用于构建Connector/ c++应用程序的工具必须与用于构建Connector/ c++本身的工具兼容,这一点很重要。理想情况下,使用与构建Connector/ c++二进制文件相同的工具构建应用程序。

为了避免这些问题,请确保这些因素对于您的应用程序和Connector/ c++本身是相同的:

  • 编译器版本。

  • 运行时库。

  • 运行时链接器配置设置。

为了避免潜在的崩溃,Connector/ c++的构建配置应该与使用它的应用程序的构建配置相匹配。例如,不要将Connector/ c++的发布版本与客户机应用程序的调试版本一起使用。

要使用不同的编译器版本、发布配置或运行时库,首先要使用所需的设置从源代码构建Connector/ c++(参见第2.4节,“从源代码安装连接器/ c++”),然后使用相同的设置构建应用程序。

连接器/ c++二进制发行版包括INFO_BIN描述用于构建发行版的环境和配置选项的文件。如果您从二进制发行版安装了Connector/ c++,并且在某个平台上遇到了与构建相关的问题,那么检查用于在该平台上构建发行版的设置可能会有所帮助。二进制分布还包括INFO_SRC提供有关产品版本和生成发行版的源存储库的信息的文件。(在连接器/ c++ 8.0.14之前,寻找BUILDINFO.txt而不是INFO_BIN而且INFO_SRC.)

c++ 11支持

X DevAPI使用c++ 11语言特性。要编译使用X DevAPI的Connector/ c++应用程序,请在编译器中使用化c++ 11选择。对于使用X DevAPI for C(普通C API)或遗留JDBC API(基于普通c++)的应用程序,不需要此选项,除非应用程序代码使用c++ 11。

连接器/ c++头文件

应用程序使用的API决定了它应该包含哪些Connector/ c++头文件。下面的include指令在include路径包含的假设下工作$ MYSQL_CPPCONN_DIR /包括,在那里MYSQL_CPPCONN_DIR美元是Connector/ c++的安装位置。通过一项-我$ MYSQL_CPPCONN_DIR /包括选项,以确保这一点。

  • 对于使用X DevAPI的应用程序:

    # include < mysqlx / xdevapi.h >
  • 对于使用X DevAPI For C的应用程序:

    # include < mysqlx / xapi.h >
  • 对于使用遗留JDBC API的应用程序,头文件是版本相关的:

    • 截至连接器/ c++ 8.0.16,单个# include指令就足够了:

      # include < mysql / jdbc.h >
    • 在Connector/ c++ 8.0.16之前,使用这组# include指令:

      #include  #include  #include  . #

      的符号< jdbc / cppconn / * . h >的所有头文件jdbc / cppconn您的应用程序所需要的目录。所需的特定文件取决于应用程序。

    • 使用Connector/ c++ 1.1的遗留代码有# include此表格的指示:

      #include  #include  #include  . #

      要在不修改的情况下使用Connector/ c++ 8.0构建这样的代码,请添加美元MYSQL_CPPCONN_DIR / include / jdbc到包含路径。

要编译打算针对Connector/ c++静态链接的代码,请定义一个宏来调整头文件中的API声明,以便与静态库一起使用。有关详细信息,请参见使用连接器/ c++静态库

增加头文件

在以下情况下需要Boost头文件:

  • 在Connector/ c++ 8.0.16之前,在Unix和类Unix平台上使用X DevAPI或X DevAPI用于C的应用程序,如果您使用海湾合作委员会以及系统上的c++标准库版本没有实现UTF8转换器(codecvt_utf8).

  • 在Connector/ c++ 8.0.23之前,编译使用遗留JDBC API的Connector/ c++应用程序。

如果需要Boost头文件,则必须安装Boost 1.59.0或更新版本,并且必须将头文件的位置添加到include路径中。要获取Boost及其安装说明,请访问Boost官方网站

链接库

使用OpenSSL构建Connector/ c++使得连接器库依赖于OpenSSL动态库。在这种情况下:

  • 当将应用程序动态链接到Connector/ c++时,此依赖关系仅在运行时相关。

  • 当静态地将应用程序链接到Connector/ c++时,还要链接到OpenSSL库。在Linux上,这意味着添加-lssl -lcrypto显式地执行到compile/link命令。在Windows上,这是自动处理的。

在Windows上,链接到c++运行时库的动态版本。

运行时库

X DevAPI为C应用程序所需要libstdc + +在运行时。根据您的平台或构建工具的不同,可能会应用不同的库。例如,图书馆是libc + +在macOS;看到第2.5.2.2节,“macOS Notes”

如果使用动态链接库构建应用程序,那么这些库不仅必须存在于构建主机上,而且必须存在于运行应用程序的目标主机上。必须正确配置动态连接器,以查找这些库及其运行时依赖项,以及查找Connector/ c++库及其运行时依赖项。

Oracle构建的连接器/ c++库依赖于OpenSSL库。后者必须安装在系统上,以便运行链接到Connector/ c++库的代码。另一种选择是将OpenSSL库放在与Connector/ c++相同的位置,在这种情况下,动态链接器应该在连接器库旁边找到它们。另请参阅第2.5.2.1节,“Windows Notes”,第2.5.2.2节,“macOS Notes”

请注意

Connector/ c++ 8.0.28版本不再支持TLSv1和TLSv1.1连接协议,TLSv1.2成为最早支持的连接协议。

使用连接器/ c++动态库

Connector/ c++动态库名称取决于平台。这些库实现了X DevAPI和X DevAPI for C,其中一个在库名称中表示ABI版本:

  • libmysqlcppconn8.so。一个(Unix)

  • libmysqlcppconn8。一个. dylib(macOS)

  • mysqlcppconn8 -一个vs神经网络. dll,使用导入库vs神经网络/ mysqlcppconn8.lib(窗口)

对于遗留JDBC API,动态库的命名如下,其中B在库名称中表示ABI版本:

  • libmysqlcppconn.so。B(Unix)

  • libmysqlcppconn。B. dylib(macOS)

  • mysqlcppconn -Bvs神经网络. dll,使用导入库vs神经网络/ mysqlcppconn-static.lib(窗口)

在Windows上,vs神经网络值取决于用于构建库的MSVC工具链版本。(Oracle提供的连接器/ c++库使用vs14与MSVC 2019和2017兼容。)该约定允许在同一系统上使用MSVC的不同版本构建的库。另请参阅第2.5.2.1节,“Windows Notes”

要构建使用X DevAPI或X DevAPI for C的代码,请添加-lmysqlcppconn8链接器选项。要构建使用遗留JDBC API的代码,请添加-lmysqlcppconn

还必须通过指定适当的库目录来指示是使用64位库还是32位库。使用一个- l要指定的链接器选项美元MYSQL_CONCPP_DIR / lib64(64位库)美元MYSQL_CONCPP_DIR / lib(32位的库)MYSQL_CPPCONN_DIR美元是Connector/ c++的安装位置。在FreeBSD,/ lib64是不习惯。库名称总是以/ lib

要构建一个使用X DevAPI的Connector/ c++应用程序,在app.cc,并动态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -I $(MYSQL_CONCPP_DIR)/include -L $(MYSQL_CONCPP_DIR)/lib64 LDLIBS = -lmysqlcppconn8 CXXFLAGS = -std=c++11

Makefile,命令使应用程序生成以下编译器调用:

g++ -std=c++11 -I…包括- l……/ lib64app.cc-lmysqlcppconn8-o app

要构建一个使用X DevAPI for C的普通C应用程序,有源代码app.c,并动态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -I $(MYSQL_CONCPP_DIR)/include -L $(MYSQL_CONCPP_DIR)/lib64 LDLIBS = -lmysqlcppconn8 app: app.c

Makefile,命令使应用程序生成以下编译器调用:

cc -我…/include -L .../lib64 app.c -lmysqlcppconn8 -o app
请注意

生成的代码,即使是用纯C编译的,也依赖于c++运行时(通常libstdc + +,尽管这可能取决于平台或构建工具;看到运行时库).

要构建使用遗留JDBC API的普通c++应用程序,需要在app.c,并动态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -I $(MYSQL_CONCPP_DIR)/include -L $(MYSQL_CONCPP_DIR)/lib64 LDLIBS = -lmysqlcppconn app: app.c

本例中的库选项为-lmysqlcppcon,而不是-lmysqlcppcon8对于X DevAPI或C应用程序的X DevAPI。

Makefile,命令使应用程序生成以下编译器调用:

cc -我…/include -L .../lib64 app.c -lmysqlcppconn -o app
请注意

当运行使用Connector/ c++动态库的应用程序时,动态连接器必须找到库及其运行时依赖项。看到运行时库

使用连接器/ c++静态库

可以将应用程序与Connector/ c++静态库链接起来。这样就不存在对连接器的运行时依赖,生成的二进制文件可以在没有安装connector / c++的系统上运行。

请注意

即使是静态链接,生成的代码仍然依赖于Connector/ c++库的所有运行时依赖性。例如,如果Connector/ c++是使用OpenSSL构建的,那么代码在运行时依赖于OpenSSL库。看到运行时库

Connector/ c++静态库名称取决于平台。这些库实现了X DevAPI和X DevAPI for C:

  • libmysqlcppconn8-static.a(macOS Unix)

  • vs神经网络/ mysqlcppconn8-static.lib(窗口)

对于遗留JDBC API,静态库的命名如下:

  • libmysqlcppconn-static.a(macOS Unix)

  • vs神经网络/ mysqlcppconn-static.lib(窗口)

在Windows上,vs神经网络值取决于用于构建库的MSVC工具链版本。(Oracle提供的连接器/ c++库使用vs14与MSVC 2019和2017兼容。)该约定允许在同一系统上使用MSVC的不同版本构建的库。另请参阅第2.5.2.1节,“Windows Notes”

要编译打算针对Connector/ c++静态链接的代码,请定义一个宏来调整头文件中的API声明,以便与静态库一起使用。定义宏的一种方法是传递- d编译器调用命令上的选项:

  • 对于使用X DevAPI、X DevAPI For C或(从Connector/ c++ 8.0.16开始)传统JDBC API的应用程序,定义STATIC_CONCPP宏。重要的是你定义它;数值并不重要。例如:-DSTATIC_CONCPP

  • 在Connector/ c++ 8.0.16之前,对于使用遗留JDBC API的应用程序,定义CPPCONN_PUBLIC_FUNC宏作为空字符串。为了确保这一点,将宏定义为CPPCONN_PUBLIC_FUNC =,而不是CPPCONN_PUBLIC_FUNC.例如:-DCPPCONN_PUBLIC_FUNC =

要构建一个使用X DevAPI的Connector/ c++应用程序,在app.cc,并静态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -DSTATIC_CONCPP -I $(MYSQL_CONCPP_DIR)/include LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn8-static。a -lssl -lcrypto -lpthread CXXFLAGS = -std=c++11

Makefile,命令使应用程序生成以下编译器调用:

g++ -std=c++11 -DSTATIC_CONCPP -I…/include app.cc .../lib64/libmysqlcppconn8-static.a -lssl -lcrypto -lpthread -o app
请注意

为避免链接器报告未解析的符号,编译行必须包括OpenSSL库和pthreadConnector/ c++代码所依赖的库。

如果构建的Connector/ c++中没有OpenSSL库,则不需要OpenSSL库,但是Oracle构建的Connector/ c++发行版确实依赖于OpenSSL。

Connector/ c++库所需的库的确切列表取决于平台。例如,在Solaris上套接字rt,nsl可能需要库。

要构建一个使用X DevAPI for C的普通C应用程序,有源代码app.c,并静态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -DSTATIC_CONCPP -I $(MYSQL_CONCPP_DIR)/include LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn8-static。一个-lssl -lcrypto -lpthread app: app.c

Makefile,命令使应用程序生成以下编译器调用:

cc -DSTATIC_CONCPP -I…/include app.c .../lib64/libmysqlcppconn8-static.a -lssl -lcrypto -lpthread -o app

要构建使用遗留JDBC API的普通C应用程序,需要在app.c,并静态链接到连接器库Makefile可能看起来像这样:

MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -DCPPCONN_PUBLIC_FUNC= -I $(MYSQL_CONCPP_DIR)/include LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn-static。一个-lssl -lcrypto -lpthread app: app.c

在本例中,库选项命名libmysqlcppcon-static.a,而不是libmysqlcppcon8-static.a对于X DevAPI或C应用程序的X DevAPI。

Makefile,命令使应用程序生成以下编译器调用:

cc -std=c++11——DCPPCONN_PUBLIC_FUNC= -I…/include app.c .../lib64/libmysqlcppconn-static.a -lssl -lcrypto -lpthread -o app

在构建纯C代码时,注意连接器对c++运行时的依赖是很重要的,这是由连接器库引入的,尽管使用它的代码是纯C:

  • 一种方法是确保使用c++连接器构建最终代码。这种方法是由Makefile所示:

    MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -DSTATIC_CONCPP -I $(MYSQL_CONCPP_DIR)/include LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn8-static。a -lssl -lcrypto -lpthread LINK。o = $(LINK.cc) #使用c++链接程序app: app.o

    Makefile,构建过程有两个步骤:首先在中编译应用程序源代码app.c使用纯C编译器生成app.o,然后链接最终可执行文件(应用程序)使用c++链接器,它负责处理对c++运行时的依赖。命令看起来像这样:

    cc -DSTATIC_CONCPP -I…/include -c -o app.o app.c g++ -DSTATIC_CONCPP -I .../include app.o .../libmysqlcppconn8-static.a -lssl -lcrypto -lpthread -o app
  • 另一种方法是使用普通C编译器和链接器,但是添加libstdc + +c++运行时库作为链接器的显式选项。这种方法是由Makefile所示:

    MYSQL_CONCPP_DIR =连接器/ c++安装位置CPPFLAGS = -DSTATIC_CONCPP -I $(MYSQL_CONCPP_DIR)/include LDLIBS = $(MYSQL_CONCPP_DIR)/lib64/libmysqlcppconn8-static。一个-lssl -lcrypto -lpthread -lstdc++ app: app.c

    Makefile,编译器的调用如下:

    cc -DSTATIC_CONCPP -I…/include app.c .../libmysqlcppconn8-static.a -lssl -lcrypto -lpthread -lstdc++ -o app
请注意

即使使用Connector/ c++的应用程序是用纯C编写的,最终的可执行程序也依赖于必须安装在要运行应用程序的目标计算机上的c++运行时。