如何构建 SOCI 库而不会出错?

Posted

技术标签:

【中文标题】如何构建 SOCI 库而不会出错?【英文标题】:How do I build the SOCI library without errors? 【发布时间】:2020-06-25 17:27:29 【问题描述】:

我在构建 SOCI 库时遇到了困难。

相关软件:

Boost 版本 1.73.0 CMake 版本 3.16 MSVC 编译器版本 19.26.28805.0 mysql 5.7 版 SOCI 4.0.0 版

相关路径:

Boost 路径是E:\cpp\Lib\boost\boost_1_73_0。 CMake 的路径是E:\Apps\CMake\share\cmake-3.16。 MySQL 服务器的路径是C:\Program Files\MySQL\MySQL Server 5.7\。 到 MSVC 的路径是 C:\Apps\32\Microsoft\Visual Studio\2019\Community\VC\Tools\MSVC\14.26.28801\bin\Hostx64\x64

构建 SOCI 的命令是 cmake -DCMAKE_BUILD_TYPE=Debut -DSOCI_CXX11=ON -DSOCI_SHARED=ON -DWITH_BOOST=ON -DWITH_MYSQL=ON ..

这是修改后的Boost.cmake 文件,位于%SOCI%\cmake\dependencies\。以## 开头的评论解释了变化。

## commented
#set(Boost_FIND_QUIETLY TRUE)

set(Boost_USE_MULTITHREADED ON)
## commented
#find_package(Boost 1.33.1 COMPONENTS date_time)

## BEGIN inserted
set(CMAKE_INCLUDE_PATH $CMAKE_INCLUDE_PATH "E:/cpp/Lib/boost/boost_1_73_0")
message(STATUS "<< set CMAKE_INCLUDE_PATH >> " $CMAKE_INCLUDE_PATH)

set(BOOST_ROOT E:/cpp/Lib/boost/boost_1_73_0)
message(STATUS "<< set BOOST_ROOT >> " $BOOST_ROOT)

message(STATUS "<< FIND_PACKAGE >>")
FIND_PACKAGE(Boost)

message(STATUS "<< FIND_PACKAGE COMPONENTS >>")
FIND_PACKAGE(Boost COMPONENTS date_time)

message(STATUS "<< Boost_FOUND >> " $Boost_FOUND)

message(STATUS "<< Boost_DATE_TIME_FOUND >> " $Boost_DATE_TIME_FOUND)
## END inserted

## commented
#if (NOT Boost_DATE_TIME_FOUND)
#  find_package(Boost 1.33.1)
#endif()

set(Boost_RELEASE_VERSION
  "$Boost_MAJOR_VERSION.$Boost_MINOR_VERSION.$Boost_SUBMINOR_VERSION")

boost_external_report(Boost RELEASE_VERSION INCLUDE_DIR LIBRARIES)

这是相关的输出。完整输出可用here。

-- Boost:
-- << set CMAKE_INCLUDE_PATH >> E:/cpp/Lib/boost/boost_1_73_0
-- << set BOOST_ROOT >> E:/cpp/Lib/boost/boost_1_73_0
-- << FIND_PACKAGE >>
-- << FIND_PACKAGE COMPONENTS >>
CMake Warning at E:/Apps/CMake/share/cmake-3.16/Modules/FindBoost.cmake:1161 (message):
  New Boost version may have incorrect or missing dependencies and imported
  targets
Call Stack (most recent call first):
  E:/Apps/CMake/share/cmake-3.16/Modules/FindBoost.cmake:1283 (_Boost_COMPONENT_DEPENDENCIES)
  E:/Apps/CMake/share/cmake-3.16/Modules/FindBoost.cmake:1921 (_Boost_MISSING_DEPENDENCIES)
  cmake/dependencies/Boost.cmake:18 (FIND_PACKAGE)
  cmake/SociDependencies.cmake:79 (include)
  CMakeLists.txt:83 (include)


-- Could NOT find Boost (missing: date_time) (found version "1.73.0")
-- << Boost_FOUND >> FALSE
-- << Boost_DATE_TIME_FOUND >> 0
-- WARNING: Boost libraries not found, some features will be disabled.

执行msbuild.exe SOCI.sln 会产生可用的输出here。

谁能告诉我为什么 SOCI 不能正确构建?为什么当date_time 组件肯定存在时却找不到它?

【问题讨论】:

你构建了什么版本的 Boost 库?您是否为 Visual Studio 2019 构建了它们?您是构建静态库还是共享库,还是两者兼而有之? warning C4003: not enough arguments for function-like macro invocation 'min' 似乎意味着它使用 windows.h 中的 min 宏而不是 std::min 相关 https://***.com/questions/13416418/define-nominmax-using-stdmin-max @squareskittles 在E:\cpp\Lib\boost\boost_1_73_0 中,我使用了命令bootstrap.bat 然后b2 install --prefix=E:\cpp\Lib\boost\boost_1_73_0\build 这并没有指定编译器,因此不能保证它们是使用 Visual Studio 2019 构建的。如果您提供其中一个构建的 name 可能会更容易您的问题帖子中的库。 运行命令b2 install --prefix=E:\cpp\Lib\boost\1_73 --build-dir=E:\cpp\Lib\boost\build --build-type=complete后的输出可用,这里:raw.githubusercontent.com/ptrongithub/misc/master/boost/…。不幸的是,第一部分被切断了。 【参考方案1】:

事实证明,我得到的大部分错误来自包含的单元测试。为什么?我不知道。但是,如果我忽略错误并继续前进,一切似乎都正常。

【讨论】:

以上是关于如何构建 SOCI 库而不会出错?的主要内容,如果未能解决你的问题,请参考以下文章

soci ODBC 的 C++ 链接器错误 LNK2019

当我链接动态库而不是静态库时,CMake 有效

Maven - 在 jar 中包含依赖库而不解包依赖项?

链接构建的静态库而不是使用 add_subdirectory?

CMake:是不是可以仅从静态库而不是源代码构建可执行文件?

如何防止我的makefile由于静态库而重新链接