前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于 CMake CMAKE_EXE_LINKER_FLAGS 选项的小坑

关于 CMake CMAKE_EXE_LINKER_FLAGS 选项的小坑

作者头像
字节星球Henry
发布2021-08-09 16:46:43
9.1K0
发布2021-08-09 16:46:43
举报

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

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

找不到 libwinpthread-1.dll 其实之前我用 VSCode 的时候也遇到了,只需要将 libstdc++ 和 libgcc 静态链接就行了,谁知 CMake 在处理 -dynamic 编译器标志的方式方面做得很奇怪,使得 -Wl,-Bstatic -lstdc++ -lwinpthread -Wl,-Bdynamic 解决方案不起作用:

代码语言:javascript
复制
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 之后:

代码语言:javascript
复制
add_executable(yourapp main.cpp)
target_link_libraries (yourapp -static gcc stdc++ winpthread -dynamic)

即使在 -dynamic 之后没有明确的库,也应该使用它,以确保标准隐式链接库正确链接。当然,也可以直接简单粗暴 -static 全静态编译(不推荐),那就啥事没有了

代码语言:javascript
复制
set(CMAKE_EXE_LINKER_FLAGS "-static")

看来以后还是少从网上扒不靠谱代码,现在这个年代说方便也方便,但也可能让你走不少的弯路,因为接触网络的人越来越多,不靠谱的人也越来越多,垃圾网站我见过太多了,有时可能没多大的问题给你绕一个大圈子,我也不知道这些人明知自己啥都不懂,写的东西完全不靠谱,还要写出来干嘛


编辑:Henry 2021-01-19

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档