编译Alfa转Solidity转换器时遇CMake权限错误求助
Alfa转Solidity转译器编译权限及antlr4依赖问题解决思路
问题概述
运行Alfa到Solidity智能合约的转译器项目时,执行make生成可执行文件遇到两类问题:
- 普通用户执行
make时,cmake无法设置/usr/local/include权限,即使将该目录权限设为777仍报错; - 使用
sudo make规避权限问题后,出现antlr4-runtime库头文件引用异常的问题。
具体错误信息
权限错误
CMake Error at _deps/googletest-build/googlemock/cmake_install.cmake:46 (file): file INSTALL cannot set permissions on "/usr/local/include": Operation not permitted. Call Stack (most recent call first): _deps/googletest-build/cmake_install.cmake:47 (include) runtime/cmake_install.cmake:47 (include) cmake_install.cmake:47 (include)
antlr4依赖错误
使用sudo make后出现antlr4-runtime头文件无法正确引用的问题,表现为编译时头文件找不到或引用路径错误。
解决方案
方案1:指定本地安装路径(推荐)
避开系统目录的权限限制,将所有依赖安装到用户私有目录:
- 清理现有build目录:
rm -rf build6 mkdir build6 && cd build6
- 配置cmake时指定安装前缀:
cmake -DCMAKE_INSTALL_PREFIX=$HOME/local ..
- 执行编译和安装:
make make install
此方法无需系统权限,且不会干扰系统全局库,同时能避免sudo导致的环境变量不一致问题。
方案2:修复系统目录权限(若需安装到系统目录)
若必须将依赖安装到/usr/local/include,可尝试以下操作:
- 检查目录所有者和权限:
ls -ld /usr/local/include
- 将目录所有者改为当前用户:
sudo chown -R $USER:$USER /usr/local/include
- 检查是否存在文件系统属性限制(如immutable):
lsattr /usr/local/include
若显示i属性,执行sudo chattr -i /usr/local/include移除。
4. 临时关闭SELinux(若系统启用):
sudo setenforce 0
完成编译后可重新开启:sudo setenforce 1。
方案3:解决sudo make导致的antlr4依赖问题
若必须使用sudo,需保留用户环境变量:
sudo -E make
同时确保antlr4-runtime的安装路径在CPATH或CMAKE_INCLUDE_PATH环境变量中,且该变量在sudo环境中被保留。
内容的提问来源于stack exchange,提问作者oswaldo
相关产品推荐
相关产品推荐

