在 Mac OS 上编译旧版本的 Wt 时出现问题

Problems when compiling older version of Wt on Mac OS

我们有一个旧项目,通常在虚拟机中 Linux 上构建。 处理这个项目是一件苦差事,因为它目前只在虚拟机中构建和运行。 我们还没有准备好投入必要的资源来用最新的库重写项目。但是,我们想在较新的计算机上使用旧库来构建它。

我们目前正在努力使它在 MacBook pro 2019 上运行 运行 Catalina 10.15.7

项目需要Wt 3.3.7 我们当前的问题在于尝试使用 make 编译 Wt。

以下是我们尝试此操作时使用的一些资源。
https://redmine.webtoolkit.eu/projects/wt/wiki/Installing_Wt_on_Mac_OS_X_Yosemite
https://www.webtoolkit.eu/wt/doc/reference/html/InstallationUnix.html
https://github.com/emweb/wt/tree/17c37f2fa9b57b1e2a6e2f412162d3df0192d785

在wt-3.3.7工程的build目录下运行make时,出现如下错误:
Linking CXX shared library libwt.dylib ld: warning: could not create compact unwind for __ZN5boost10filesystem6detail5spaceERKNS0_4pathEPNS_6system10error_codeE.cold.111: stack size is large but stack subq instruction not found

ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [src/libwt.3.3.7.dylib] Error 1
make[1]: *** [src/CMakeFiles/wt.dir/all] Error 2
make: *** [all] Error 2

问题似乎是在尝试制作 libwt.3.3.7.dylib 文件时出现的。 这个问题似乎也与我们使用的 boost 库有关。 (提升 1.54.0)
我们在 makefile 中指定了 boost 目录,也许这没有正确完成。
在线搜索似乎表明它可能在应该使用 C++ 时尝试使用 C 进行编译。不确定这是否真的是问题所在。

我们试过了
“update_dyld_shared_cache”命令

也试过
将 CMAKE_LINKER 值更改为 usr/local/bin/g++-8
将 CMAKE_CXX_COMPILER 值更改为 usr/local/bin/g++-8
将 CMAKE_C_COMPILER 值更改为 usr/local/bin/gcc-8
根据 Linking c++ libraries (for Wt) in Xcode
添加“-std=c++11 -stdlib=libc++”到 CMAKE_CXX_FLAGS 所有这些都在 CMakeCache.txt

中找到

这是一个 link 到我们的压缩构建目录,其中包含所有 makefile 等
https://www.mediafire.com/file/s8d47b7sr0tn06h/build.zip/file
也可能值得一提我们的 clang 版本。
Apple clang 版本 11.0.3 (clang-1103.0.32.62)
目标:x86_64-apple-darwin19.6.0
线程模型:posix
安装目录:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

感谢任何帮助,我们不确定如何解决此问题。

对于任何想知道的人,我都编译了它。看来问题出在使用 clang++ 上。

  1. 使用正确版本的 Boost 和 MySQL。 对我来说是 Boost 1.54 和 MariaDB。
    Boost 1.54 需要一些工作来编译,确保库确实存在于下载的存储库中,我不得不一个一个地手动下载它们。
    这是在 ccmake 界面中完成的。

  2. 更改 CMAKE_CXX_COMPILER 以使用 GCC c++-11 编译器。
    对我来说它位于 /usr/local/Cellar/gcc/11.3.0/bin/c++-11
    我使用 Homebrew 安装了 GCC。
    这是在 ccmake 界面中完成的。

  3. 将以下标志添加到 CMAKE_CXX_FLAGS "-std=c++11 -arch x86_64"
    这是在 ccmake 界面中完成的。

  4. 不确定是否需要,我将 boost 路径添加到 WtFindBoost-cmake.txt 文件。

SET(CMAKE_INCLUDE_PATH ${CMAKE_INCLUDE_PATH} "/usr/local/Cellar/boost/1.54.0")  
SET(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} "/usr/local/Cellar/boost/1.54.0/lib")  
SET(BOOST_INCLUDEDIR /usr/local/Cellar/boost/1.54.0/include)  
SET(BOOST_LIBRARYDIR /usr/local/Cellar/boost/1.54.0/lib)  
SET(BOOST_ROOT /usr/local/Cellar/boost/1.54.0)  
SET(BOOST_DIR /usr/local/Cellar/boost/1.54.0)  

我也强制使用确切的 Boost 版本。

FIND_PACKAGE(Boost 1.54.0
  EXACT
  COMPONENTS
    ${Boost_COMPONENTS}
  REQUIRED
)
  1. 不确定是否需要,我禁用了 ENABLE_LIBWTTEST 和 BUILD_TESTS。
    这是在 ccmake 界面中完成的。


  2. 中更改一个return值 include/boost/date_time/local_time/custom_time_zone.hpp

改变

virtual bool has_dst() const
{
  return (dst_calc_rules_); //if calc_rule is set the tz has dst
}

virtual bool has_dst() const
{
  return bool(dst_calc_rules_); //if calc_rule is set the tz has dst
}