CLion生成错误CMake命令:arm交叉编译时链接报错
解决CLion交叉编译ARM时出现
cannot find entry symbol arch_paths_first的问题 我之前也碰到过类似的情况,核心问题是CMake在Mac宿主环境下默认添加了Darwin(Mac OS)特有的链接选项,而你的交叉ARM编译器不识别这个选项。下面是具体的解决方法:
方法1:正确配置交叉编译工具链文件(推荐)
CMake如果不知道你是在做交叉编译,就会默认用宿主系统(Mac)的链接规则,所以第一步要明确告诉CMake目标系统是Linux。
- 创建一个工具链文件,比如
arm-linux-musleabihf.toolchain.cmake,内容如下:
# 指定目标系统和架构 set(CMAKE_SYSTEM_NAME Linux) set(CMAKE_SYSTEM_PROCESSOR arm) # 设置交叉编译器路径 set(CMAKE_C_COMPILER arm-linux-musleabihf-gcc) set(CMAKE_CXX_COMPILER arm-linux-musleabihf-g++) # 清空Darwin特有的初始链接选项 set(CMAKE_EXE_LINKER_FLAGS_INIT "") set(CMAKE_SHARED_LINKER_FLAGS_INIT "") set(CMAKE_MODULE_LINKER_FLAGS_INIT "") # 可选:设置目标系统的根目录(如果有sysroot的话) # set(CMAKE_SYSROOT /path/to/arm-linux-musleabihf/sysroot)
- 在CLion中配置这个工具链:
- 打开
Settings->Build, Execution, Deployment->CMake - 在
CMake options里添加:-DCMAKE_TOOLCHAIN_FILE=/绝对路径/arm-linux-musleabihf.toolchain.cmake - 点击
Apply后重新生成CMake缓存,此时link.txt里就不会再出现-Wl,-search_paths_first了
- 打开
方法2:直接在CMakeLists.txt中移除错误选项
如果不想用工具链文件,也可以手动从链接参数里删掉那个Mac特有的选项:
在你的CMakeLists.txt中,project()指令之后添加以下代码:
# 检查是否是Mac宿主环境,移除Darwin特有的链接选项 if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Darwin") # 从C++链接 flags 中移除 string(REPLACE "-Wl,-search_paths_first" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}") # 从可执行文件链接 flags 中移除 string(REPLACE "-Wl,-search_paths_first" "" CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}") endif()
为什么会出现这个问题?
Eclipse中编译正常是因为你手动配置了交叉编译的所有参数,没有引入Mac的链接选项;而CLion依赖CMake自动生成构建规则,CMake在检测到宿主是Mac时,会默认给链接器加上-Wl,-search_paths_first(这是Mac的ld用来控制搜索路径顺序的选项),但你的ARM交叉链接器arm-linux-musleabihf-ld根本不认识这个选项,所以才会报cannot find entry symbol arch_paths_first的错误。
内容的提问来源于stack exchange,提问作者Marcin Zdunek
相关产品推荐
相关产品推荐

