MENU

关于 CMake CMAKE_EXE_LINKER_FLAGS 选项的小坑

• January 19, 2021 • Read: 282 • 解决方案

之前都没用过 CMake,最近因为需要用 CLion,CLion 基于 CMake 来开发项目,所以肯定要写 CMakeLists,因为这个,遇到不少问题。最近一个项目里的 CMakeList.txt 是在网上找来的例子改的,恕我直言,网上的东西是真不靠谱,昨天一篇文章我也是在吐槽,可能是计算机太热门了,什么牛鬼蛇神都往计算机来凑热闹,文章你扒我我扒你,错误一传十十传百,我也不想多说了,多读点书吧一个个的,别发一些误导人的文章(所谓的教程)了!

如果自己的 exe 要到别人的电脑上运行,那就需要相应的链接库,昨天我把我的程序发给朋友,就出现了如图所示的情况:

GTNCJ4LA6RYSPIZ539.png

找不到 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


Last Modified: February 2, 2021
Archives QR Code
QR Code for this page
Tipping QR Code