我正在 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_PATH
、 LIBRARY_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/