我正在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那样工作),但它似乎找不到它。
我也没有根在机器上。
发布于 2015-12-15 03:03:33
直到我看到这个问题,我才尝试在CentOS 6上构建源代码,但我已经能够在CentOS 7.1和Ubuntu14.04上构建SWIFT2.2,并取得了部分成功。有几件事要考虑:
至于您的具体问题,这是因为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错误链接出去。
我确信处理这个问题的方法有很多种,但解决问题的方法是设置以下环境变量,请根据您的具体设置进行调整:
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在运行时可供动态链接器使用。既然你没有根,那就做
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安装,但配置/构建工作很好地超过了错误。
希望这能帮上忙。如果你遇到别的事请告诉我们。
发布于 2015-12-14 08:43:07
CheckAtomic.cmake似乎是LLVM的一部分。我在Github找到了一个文件,它试图从libatomic中找到'__atomic_fetch_add_4‘。
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)这对你来说是失败的。查看CMakeFiles/CMakeError.log,了解此测试失败的更多细节。或者在新项目中尝试这一行。
https://stackoverflow.com/questions/34234250
复制相似问题