最近在windows上调试一个dll库时,调用库里一个函数一直闪崩,查看日志和堆栈信息发现崩溃的地方都很奇怪,都是函数return之后崩掉的,怀疑是函数里各种栈变量加起来大小超过程序默认栈大小了,于是想要编译时修改默认栈大小再做测试。
我的编译环境是vs2017,使用cmake进行编译处理,因此就研究如何在cmakelists.txt上添加编译时设置栈大小的变量。网上搜了一圈,包括AI都上了,各种信息都有,也是天下一大抄抄来抄去,什么add_link_options、target_link_options、add_compile_options、CMAKE_EXE_LINKER_FLAGS、CMAKE_SHARED_LINKER_FLAGS、CMAKE_MSVC_RUNTIME_LIBRARY等等,啥说法都有。最终验证下来要么就是要求高版本cmake,要么就是linux上gcc才有效,要么就是完全没用的,浪费很多时间。最后没办法还是去看cmake社区的使用说明吧,虽然是英文的但是硬着头皮看还是能看点东西出来,上面就建议说老版本cmake还是使用LINK_FLAGS属性来设置链接时的参数,于是在cmakelists.txt上添加了几行:
if(MSVC)
set_target_properties(mytarget PROPERTIES LINK_FLAGS "${LINK_FLAGS} /STACK:67108864")
endif()
上面是设置栈大小为64MB,专门针对MSVC编译环境,如果是其它环境需要修改对应环境的参数。重新运行cmake编译后,终于生效了。