try_compile警告错误输出位置及Emscripten MEMORY64线程库问题排查
解决Emscripten MEMORY64模式下CMake try_compile链接错误输出查看问题
查看CMake临时目录的日志文件
CMake执行try_compile(包括CHECK_C_SOURCE_COMPILES这类封装函数)时,会在临时目录生成详细的编译/链接日志:
- 默认临时目录位于构建目录下的
CMakeFiles/CMakeTmp(若指定了CMAKE_TRY_COMPILE_DIR则以该路径为准) - 目录内的
CMakeError.log会记录所有失败的编译/链接过程的详细错误,包括链接器的输出内容;CMakeOutput.log则记录成功的编译信息 - 直接打开这两个日志文件即可获取最原始的错误细节
启用CMake详细输出模式
- 运行CMake配置时添加
--verbose(或-v)参数,会实时打印try_compile阶段执行的编译、链接命令以及对应的输出信息,包含链接器错误 - 也可以在CMake脚本中设置
CMAKE_VERBOSE_MAKEFILE=ON,让后续构建过程输出更详细的命令日志
自定义捕获try_compile输出到CMake变量
使用try_compile的OUTPUT_VARIABLE参数,将编译/链接的完整输出保存到指定变量,随后可以通过message打印:
# 编写测试线程支持的源文件test_threads.c,内容可参考CMake内置的Threads检测代码 try_compile(THREADS_COMPILE_OK ${CMAKE_BINARY_DIR}/TryCompileThreads SOURCE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/test_threads.c OUTPUT_VARIABLE THREADS_LINK_OUTPUT CMAKE_FLAGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DS_MEMORY64=1" "-DPTHREADS=1") # 打印捕获到的链接输出 message(STATUS "Threads链接输出详情:\n${THREADS_LINK_OUTPUT}")
手动用Emscripten编译测试
直接使用emcc手动编译测试文件,绕过CMake的封装,能更直接获取链接器错误:
# 编写简单的线程测试代码test.c emcc -s MEMORY64=1 -pthread test.c -o test.wasm
执行后终端会直接输出链接过程中的所有错误信息,帮助快速定位问题
内容的提问来源于stack exchange,提问作者Mark Storer
相关产品推荐
相关产品推荐

