首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在CentOS上建立Swift

在CentOS上建立Swift
EN

Stack Overflow用户
提问于 2015-12-11 23:30:05
回答 2查看 3.2K关注 0票数 2

我正在CentOS 6上从源代码构建Swift编译器,并且遇到了一个库问题。在与构建脚本进行了一段时间的斗争之后,我终于找到了运行./utils/build-script的地方:

代码语言:javascript
复制
+ /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在那里:

代码语言:javascript
复制
$ 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那样工作),但它似乎找不到它。

我也没有根在机器上。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-15 03:03:33

直到我看到这个问题,我才尝试在CentOS 6上构建源代码,但我已经能够在CentOS 7.1和Ubuntu14.04上构建SWIFT2.2,并取得了部分成功。有几件事要考虑:

  • 您将需要构建Swift所需的众多依赖项,除非它们恰好已经在系统上,否则需要根访问来安装它们。
  • 使用-R标志与构建脚本一起创建发布版本。在DebugAssert中构建(默认)将需要大量内存。在我的例子中,即使是14 GB也不够。发行版构建 大约6GB就可以完成。

至于您的具体问题,这是因为Clang依赖与GCC相关的标头和库包。参见,例如,软呢帽21,无gcc

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

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

代码语言:javascript
复制
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在运行时可供动态链接器使用。既然你没有根,那就做

代码语言:javascript
复制
export LD_LIBRARY_PATH=/opt/gcc-4.8.2/lib64

如果你有根,你可以使用ldconfig

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

有趣的是,CMakeOutput.log文件仍然没有报告找到GCC 4.8.2作为候选人GCC安装,但配置/构建工作很好地超过了错误。

希望这能帮上忙。如果你遇到别的事请告诉我们。

票数 1
EN

Stack Overflow用户

发布于 2015-12-14 08:43:07

CheckAtomic.cmake似乎是LLVM的一部分。我在Github找到了一个文件,它试图从libatomic中找到'__atomic_fetch_add_4‘。

代码语言:javascript
复制
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)

这对你来说是失败的。查看CMakeFiles/CMakeError.log,了解此测试失败的更多细节。或者在新项目中尝试这一行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34234250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档