【CMake 笔记】CMake疑难杂症汇总(不定期更新)

文章讲述了在CMake中如何避免多配置生成器自动生成子目录以及在Windows环境下使用非最新msvc编译器时rc.exe找不到的解决方案。通过设置环境路径和指定CMAKE_RC_COMPILER可解决编译问题。另外,针对Msys2的MinGW下wxWidgets无法使用的问题,提到了需要将MSYS2的/usr/bin添加到环境变量中以使wxWidgets正常工作。
摘要由CSDN通过智能技术生成

1. 多配置生成器(Visual Studio, Xcode, Ninja Multi-Config) 输出目录禁止自动添加子目录

参考:https://qa.1r1g.com/sf/ask/542350021

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")

改成

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$<0:>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$<0:>")

效果:
在这里插入图片描述
变为
在这里插入图片描述


2. CMake使用Windows系统内其他版本(非最新版)msvc编译器时出现rc.exe找不到的问题

复现条件:Windows中同时安装了多个工具集,而当前项目需要用到旧的工具集,且使用的构建工具非Visual Studio(可能是ninja或Makefile,Visual Studio作为工具集去进行CMake配置的话一般不会出现这个问题)。
CMake输出情况:
错误信息
解决办法:

  1. project 命令前添加以下命令(地址根据实际情况修改) :
    set(ENV{Path} "$ENV{Path};C:/Program Files (x86)/Windows Kits/8.1/bin/x86")
    
  2. project 命令之后添加以下命令(地址根据实际情况修改):
    set(CMAKE_RC_COMPILER "C:/Program Files (x86)/Windows Kits/8.1/bin/x86/rc.exe")
    

修改完大致如下:

cmake_minimum_required(VERSION 3.21)

set(ENV{Path} "$ENV{Path};C:/Program Files (x86)/Windows Kits/8.1/bin/x86")     # 第一步
project(test1 CXX C)

set(CMAKE_CXX_STANDARD 14)

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$<0:>")
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/$<0:>")

set(CMAKE_RC_COMPILER "C:/Program Files (x86)/Windows Kits/8.1/bin/x86/rc.exe") #第二步

add_subdirectory(src)
...

最后,清空构建目录,重新构建,问题应该解决了,如还没解决,留言一下,我尝试帮忙解决。


3. Msys2的MinGW下安装的wxWidgets无法使用问题

CMake脚本:

find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base)

if (wxWidgets_USE_FILE) # not defined in CONFIG mode
    include(${wxWidgets_USE_FILE})
endif ()

add_executable(wxTest main.cpp)

执行后会出现(为方便调试,我使用了CLion):

CMake Error at D:/Program Files/JetBrains/CLion 2022.2.1/bin/cmake/win/x64/share/cmake-3.25/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Could NOT find wxWidgets (missing: wxWidgets_LIBRARIES
  wxWidgets_INCLUDE_DIRS) (Required is at least version "3.2")
Call Stack (most recent call first):
  D:/Program Files/JetBrains/CLion 2022.2.1/bin/cmake/win/x64/share/cmake-3.25/Modules/FindPackageHandleStandardArgs.cmake:600 (_FPHSA_FAILURE_MESSAGE)
  D:/Program Files/JetBrains/CLion 2022.2.1/bin/cmake/win/x64/share/cmake-3.25/Modules/FindwxWidgets.cmake:977 (find_package_handle_standard_args)
  CMakeLists.txt:22 (find_package)

图片如下:
错误输出

根据我的跟踪调试,发现其主要原因是 Windows无法找到shell命令,也就是说,需要把MSYS2的/usr/bin加入环境变量。可以看下面这张图:
问题所在
可以看出,这句命令的输出结果是:系统找不到指定的文件。很明显,Windows找不到 sh 这个命令。

CMake更改后如下:

set(ENV{PATH} "$ENV{PATH};D:/Programs/msys64/usr/bin")  #根据大家的实际情况设置位置

find_package(wxWidgets 3.2 REQUIRED COMPONENTS core base)

if (wxWidgets_USE_FILE) # not defined in CONFIG mode
    include(${wxWidgets_USE_FILE})
endif ()

add_executable(wxTest main.cpp)

至此,该问题解决,我使用 “pacman -Ss ${MINGW_PACKAGE_PREFIX}-wxwidgets3.2-msw” 安装的 wxwidgets3.2 总算是用上了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xiao_Ley

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值