之前都没用过 CMake,最近因为需要用 CLion,CLion 基于 CMake 来开发项目,所以肯定要写 CMakeLists,因为这个,遇到不少问题。最近一个项目里的 CMakeList.txt 是在网上找来的例子改的,恕我直言,网上的东西是真不靠谱,昨天一篇文章我也是在吐槽,可能是计算机太热门了,什么牛鬼蛇神都往计算机来凑热闹,文章你扒我我扒你,错误一传十十传百,我也不想多说了,多读点书吧一个个的,别发一些误导人的文章(所谓的教程)了!
如果自己的 exe 要到别人的电脑上运行,那就需要相应的链接库,昨天我把我的程序发给朋友,就出现了如图所示的情况:
找不到 libwinpthread-1.dll
其实之前我用 VSCode 的时候也遇到了,只需要将 libstdc++ 和 libgcc 静态链接就行了,谁知 CMake 在处理 -dynamic
编译器标志的方式方面做得很奇怪,使得 -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic
解决方案不起作用:
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++ -Wl,-Bstatic -lstdc++ -lpthread -Wl,-Bdynamic")
实际上在 CMake 中有效的是直接使用链接器标志, 因此在 CMake 中,这似乎是静态链接到所有 mingw-w64 C ++ 依赖项的最佳方法。
查了一下发现, CMAKE_EXE_LINKER_FLAGS
这个变量好像就没几个人用, 网上普遍建议的是使用 target_link_libraries
的写法,注意 target_link_libraries
要加在 add_executable
之后:
add_executable(yourapp main.cpp)
target_link_libraries (yourapp -static gcc stdc++ winpthread -dynamic)
即使在 -dynamic
之后没有明确的库,也应该使用它,以确保标准隐式链接库正确链接。当然,也可以直接简单粗暴 -static
全静态编译(不推荐),那就啥事没有了。
set(CMAKE_EXE_LINKER_FLAGS "-static")
看来以后还是少从网上扒不靠谱代码,现在这个年代说方便也方便,但也可能让你走不少的弯路,因为接触网络的人越来越多,不靠谱的人也越来越多,垃圾网站我见过太多了,有时可能没多大的问题给你绕一个大圈子,我也不知道这些人明知自己啥都不懂,写的东西完全不靠谱,还要写出来干嘛。
编辑:Henry 2021-01-19 未经授权禁止转载
版权属于:字节星球/肥柴之家 (转载请联系作者授权)
原文链接:https://www.bytecho.net/archives/cmake_exelinker.html
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。