CMake构建开源项目在VS中遇/Wl,--stack,4194304错误求解决
解决Command line error D8021: invalid numeric argument '/Wl,--stack,4194304'的问题
这个错误一眼就能揪出问题所在——你给Visual Studio用的MSVC编译器传入了GCC/Clang专属的链接器参数,它肯定不认啊!
错误根源
你的CMakeLists.txt里的-Wl,--stack,4194304是GCC系列编译器(比如MinGW)用来指定栈大小的语法,而MSVC有一套完全不同的参数规则:
- MSVC不会把
-Wl,...解析成传递给链接器的指令,反而会把整个字符串当成给编译器的无效参数,直接报错。 - 另外
-fpermissive也是GCC独有的选项,用来放宽C++语法检查,MSVC同样不支持这个参数。
修复方案
我们需要让CMake根据不同的编译器类型,分别设置对应的参数,这样不管是用MSVC还是MinGW构建都能正常工作。
修改你的CMake代码如下:
if(WIN32) # 区分MSVC和GCC系编译器 if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") # MSVC设置栈大小用/STACK链接器选项,要加到链接器参数里 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:4194304") # MSVC没有-fpermissive的直接替代选项,如果需要放宽语法检查 # 可以考虑使用/permissive-(关闭严格标准模式),或者根据实际需求调整 # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /permissive-") else() # 针对MinGW等GCC系编译器,保留原来的参数 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--stack,4194304 -fpermissive") endif() endif()
额外说明
- 栈大小参数的位置:MSVC的
/STACK是链接器选项,所以要加到CMAKE_EXE_LINKER_FLAGS而不是CMAKE_CXX_FLAGS里,后者是给C++编译器的参数,放错位置也会导致问题。 - 关于-fpermissive:如果你的项目不需要兼容非标准C++语法,可以直接删掉这个参数;如果需要在MSVC下实现类似效果,可以查MSVC的文档,
/permissive-是比较接近的选项(但注意它是关闭严格标准,和GCC的-fpermissive行为不完全一致)。 - 简化版本:如果你的项目只需要支持MSVC,那直接写成下面这样就行:
if(WIN32) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /STACK:4194304") # 移除-fpermissive,因为MSVC不支持 endif()
修改完CMakeLists.txt后,记得重新生成Visual Studio项目文件,再编译就不会报错啦!
内容的提问来源于stack exchange,提问作者Joe Robert
相关产品推荐
相关产品推荐

