swift - 在 CentOS 上构建 Swift

标签 swift cmake centos

我正在 CentOS 6 上从源代码构建 Swift 编译器,并且遇到了库问题。在与构建脚本斗争了一段时间后,我已经开始运行 ./utils/build-script最终给出:

+ /home/src/cmake-3.4.1-Linux-x86_64/bin/cmake --build /home/src/swift/build/Ninja-DebugAssert/cmark-linux-x86_64 -- all
ninja: no work to do.
llvm: using standard linker
+ cd /home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64
+ /home/src/cmake-3.4.1-Linux-x86_64/bin/cmake -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ '-DCMAKE_C_FLAGS= ' '-DCMAKE_CXX_FLAGS= ' -DCMAKE_BUILD_TYPE:STRING=Debug -DLLVM_ENABLE_ASSERTIONS:BOOL=TRUE -DLLVM_TOOL_SWIFT_BUILD:BOOL=NO '-DLLVM_TARGETS_TO_BUILD=X86;ARM;AArch64' -DLLVM_INCLUDE_TESTS:BOOL=TRUE -LLVM_INCLUDE_DOCS:BOOL=TRUE -DCMAKE_INSTALL_PREFIX:PATH=/usr -DINTERNAL_INSTALL_PREFIX=local /home/src/swift/llvm
CMake Error at cmake/modules/CheckAtomic.cmake:36 (message):
  Host compiler appears to require libatomic, but cannot find it.
Call Stack (most recent call first):
  cmake/config-ix.cmake:296 (include)
  CMakeLists.txt:403 (include)


-- Configuring incomplete, errors occurred!
See also "/home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64/CMakeFiles/CMakeOutput.log".
See also "/home/src/swift/build/Ninja-DebugAssert/llvm-linux-x86_64/CMakeFiles/CMakeError.log".
./utils/build-script: command terminated with a non-zero exit status 1, aborting

( gcc-4.8.2 是我编译 llvm 时使用的)

libatomic有吗:

$ locate libatomic
/opt/gcc-4.8.2/lib64/libatomic.a
/opt/gcc-4.8.2/lib64/libatomic.la
/opt/gcc-4.8.2/lib64/libatomic.so
/opt/gcc-4.8.2/lib64/libatomic.so.1
/opt/gcc-4.8.2/lib64/libatomic.so.1.0.0

我只是不知道如何告诉构建系统去哪里寻找。我已经尝试了通常的CMAKE_LIBRARY_PATH (在命令行上导出 - 我不确定 cmake 是否像 LD_LIBRARY_PATHLIBRARY_PATH work 那样工作)但它似乎找不到它。

我的机器上也没有root权限。

最佳答案

在看到这个问题之前,我没有尝试在 CentOS 6 上从源代码构建,但我已经能够在 CentOS 7.1 和 Ubuntu 14.04 上构建 Swift 2.2,并取得部分成功。需要考虑的一些事情:

  • 您将需要构建 Swift 所需的大量依赖项,除非 它们恰好已经在系统上,您将需要 root 访问权限 安装它们。
  • 在构建脚本中使用 -R 标志来创建发布版本。 构建 DebugAssert(默认)将需要大量内存。就我而言,即使 14 GB 也不够。发布版本
    大约 6 GB 即可完成。

至于您的具体问题,它与 Clang 对 GCC 相关包的 header 和库的依赖有关。例如,参见 Fedora 21 with clang, without gcc

即使您安装了 GCC 4.8.2 并从 4.8.2 调整了使用 gcc 和 g++ 的路径,Clang 可能仍然会在旧的 GCC 目录中查找头文件和库。 CMake 首先尝试编译一个包含 header atomic 的 C++ 测试文件,该 header 在旧 GCC 中不存在。因此,它然后尝试链接使用库 libatomic 的 C 测试程序,该库在旧 GCC 中又不存在。您可以通过查看 usr1234567 提到的 llvm/cmake/modules/CheckAtomic.cmake 来看到这一点。 CMakeError.log 和 CMakeOutput.log 也可以提供有值(value)的见解。顺便说一句,当我在 CentOS 7.1 上构建 Swift 时,我没有遇到这个问题,因为 Clang 使用 GCC 4.8.2 作为头文件和库,并且找到了 atomic 头文件,因此编译了 C++ 文件。但是,如果完成了 libatomic 检查,它就会失败,因为存储库提供的 4.8.2 中的 libatomic.so 具有 INPUT ( <name of some non-existent file> ) ,因此尝试与 libatomic 链接会出错。

我确信有多种方法可以解决这个问题,但对我来说解决问题的是设置以下环境变量,请根据您的具体设置进行调整:

export CPLUS_INCLUDE_PATH=/opt/gcc-4.8.2/include/c++/4.8.2:/opt/gcc-4.8.2/include/c++/4.8.2/x86_64-unknown-linux-gnu

export LIBRARY_PATH=/opt/gcc-4.8.2/lib64:/opt/gcc-4.8.2/lib/gcc/x86_64-unknown-linux-gnu/4.8.2

还要确保 4.8.2 版本的 libstdc++.so 在运行时可供动态链接器使用。由于您没有 root,所以

export LD_LIBRARY_PATH=/opt/gcc-4.8.2/lib64

如果您有 root 权限,则可以使用 ldconfig

在开始构建 Swift 之前,您可能需要尝试使用 Clang 构建一个简单的 C 程序,将其与 libatomic 链接(该代码实际上不必使用库中的任何符号)和一个简单的 C++ 程序,其中包括<atomic> header 。编译 C++ 程序时,使用 -std=c++11 编译器标志。如果C++程序编译成功,则libatomic链接测试不一定成功。

有趣的是,CMakeOutput.log 文件仍然没有报告发现 GCC 4.8.2 作为候选 GCC 安装,但配置/构建运行良好,克服了错误。

希望这有帮助。如果您遇到其他问题,请告诉我们。

关于swift - 在 CentOS 上构建 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34234250/

相关文章:

ios - Swift - 在 AppDelegate 中实例化 View Controller

c++ - CLion 在运行可执行文件时找不到共享库

opencv - 在 centos 的 pkg-config 搜索路径中找不到包 opencv

Python virtualenv 没有名为 django 的模块

c++ - CMake:找不到头文件

python - python3.7 pypi-server:SSLCertVerificationError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地发行者证书

ios - Swift:在当前参数寄存器中找到选择器名称:release

ios - Swift - App Store Connect 版本无法检测 Catalyst 环境

ios - 将日期转换为格式为 "yyyy-MM-dd' T'HH :mm:ssZ"的字符串

c++ - ctypes,添加静态库时 undefined symbol