Clang合并Windows下COFF目标文件为.lib时遇mainCRTStartup未定义错误
Windows下Clang合并.obj为.lib并生成可执行文件的问题解决
问题场景
- 用Clang编译时,需要把多个.obj文件打包成一个.lib静态库,再基于这个.lib生成可执行文件
- 用lld-link的
/lib选项打包时触发错误:lld-link: error:
: undefined symbol: mainCRTStartup - 对比Unix环境:在Unix下可以用
ld.lld -r(-relocatable参数)合并ELF目标文件为可重定位目标文件,后续能正常生成可执行文件,但Windows下没有对应选项
原因解析
- Windows的COFF格式没有Unix ELF那种可重定位合并的机制,lld-link也没有
-r选项 lld-link /lib生成的是静态库,本质是目标文件的集合,不是可重定位目标文件,本身不包含启动代码的链接逻辑- 如果把带
main函数的.obj也塞进.lib,链接可执行文件时,lld-link找不到C运行时入口mainCRTStartup的正确关联信息,就会报错
解决办法
- 核心思路:别把包含
main函数的.obj文件打包进.lib,单独留着这个.obj用于最终链接 - 具体步骤示例:
- 编译非main的源文件为.obj:
clang -c module1.c -o module1.obj clang -c module2.c -o module2.obj - 将这些非main的.obj打包成.lib:
lld-link /lib module1.obj module2.obj -out:mylib.lib - 链接main.obj、静态库和C运行时生成可执行文件:
clang main.obj mylib.lib -o myapp.exe
- 编译非main的源文件为.obj:
内容的提问来源于stack exchange,提问作者Sasisa Play
相关产品推荐
相关产品推荐

