运行 js 文件出现 Error: A dynamic link library (DLL) initialization routine failed 错误
概要
既上次出现 Error: The specified module could not be found.
问题之后,又出现了新的问题
运行 js 文件时会出现
node:internal/modules/cjs/loader:1340
return process.dlopen(module, path.toNamespacedPath(filename));
^
Error: A dynamic link library (DLL) initialization routine failed.
原因
在 CMakeLists.txt
文件中添加内存泄漏检测的库(asan)时,只注释了 list(APPEND EXTRA_LIBS clang_rt.asan)
,没有将其他依赖的选项也注释掉;
导致在运行时仍然会提示有 DLL 未初始化成功
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fno-omit-frame-pointer -fsanitize=address")
add_definitions(-D_DEBUG)
#list(APPEND EXTRA_LIBS clang_rt.asan)
endif()
解决方法
将 set(xxx)
这三行都注释掉,就不会出现问题了
小结
这个问题其实是很奇怪的,在出现 DLL 初始化失败时,第一反应是第三方依赖库没添加成功,但是这次是没有依赖第三方库的,所以最终才排查到 asan 也算是“第三方库”
后面在添加任何库,不管是系统库还是自己弄得三方库,都要确保在添加了 CMAKE_SHARED_LINKER_FLAGS
参数后,同时添加库的名字或者路径