构建环境
windows 11
cmake 3.29.0-rc2
MinGW 8.1.0
先说结论
推测这应该是MinGW和cmake版本的部分不兼容导致的,尝试使用旧一点的cmake或新一些的MinGW或许会解决这个问题。
进一步进行定位后发现,这是因为project()的位置没对导致的
- gpt4:
建立 project 指令通常應該在所有其他命令之前。CMake 推薦在 CMakeLists.txt 文件的開頭,立即在
cmake_minimum_required 之後。將 project 指令移至全局配置文件中,或者至少在添加子目錄和執行其他設置之前。
所以将project()写到cmake_minimum_required 之后问题解决。
另外如果使用msvc的构建工具时并不会出错。
诡异的 0
是怎么来的
首先这个程序没有链接任何外部库,也没导出任何库;
我通过添加cmake -- VERBOSE=1
参数查看详细信息后发现问题出在build.make
文件中的这一句命令
F:/MinGW/bin/c++.exe -g \
-Wl,--whole-archive CMakeFiles/print_hello_world.dir/objects.a \
-Wl,--no-whole-archive -o print_hello_world.exe \
-Wl,--out-implib,"" \
-Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/print_hello_world.dir/linkLibs.rsp
经过分析问题是在--out-implib,""
这个参数,不明白cmake为什么会生成这一句,似乎这个版本的c++.exe
没有将""
识别为空 ,并且又把--major-image-version
后面的主版本号0
识别为了一个库,所以才出现了这个链接错误,删除-Wl,--out-implib,""
或主版本号0后恢复正常,这里肯定是选择删除-Wl,--out-implib,""
才符合语义。
另外如果链接了第三方库,反而不会出问题。