关于#cmake#的编译器不同问题,如何解决?

关于使用Cmake动态库使用不同编译器结果出错的问题
同一串代码在使用visual studio 2022 时显示无法链接
但是使用MinGW Makefiles 就可以通过
错误显示的是这个
LINK : fatal error LNK1104: 无法打开文件“lib\Debug\subtract.lib” [C:\Users\xxxx\Desktop\test\cmkedemo\build\demo.vcxproj]

cmake_minimum_required(VERSION 3.10)
project(demo VERSION 1.0)
set(CMAKE_CXX_STANDARD 11)



set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)

#configure_file(config.h.in config.h)
add_executable(demo main.cpp)
add_subdirectory(calc)

target_link_libraries(demo PUBLIC addition)
target_link_libraries(demo PUBLIC subtract)


target_include_directories(demo PUBLIC ${demo_BINARY_DIR}
                                       ${demo_SOURCE_DIR}/calc)

该回答内容部分引用GPT,GPT_Pro更好的解决问题
解决Cmake使用不同编译器出现的错误,可以参考以下步骤:

  1. 首先,确定你当前编译器的版本,如果是Visual Studio,一般版本会有2022、2021等;如果使用MinGW,则需要查看其具体的版本号。

  2. 然后,在CMakeLists.txt中设置对应的编译器版本,如下所示:

    if(MSVC) 
     set(CMAKE_C_COMPILER "cl.exe") # 设置c编译器 
     set(CMAKE_CXX_COMPILER "cl.exe") # 设置c++编译器 
     set(CMAKE_GENERATOR "Visual Studio 2022") # 设置生成器 
    elseif(MINGW) 
     set(CMAKE_C_COMPILER "MinGW Makefiles") # 设置c编译器 
     set(CMAKE_CXX_COMPILER "MinGW Makefiles") # 设置c++编译器 
    endif() 
    
  3. 然后,在CMakeLists.txt中设置对应的C++标准,如下所示:

    set(CMAKE_CXX_STANDARD 11) # 设置c++标准为11
    
  4. 接下来,在CMakeLists.txt中添加相关依赖库,如下所示:

    target_link_libraries(demo PUBLIC addition) # 添加addition库 
    target_link_libraries(demo PUBLIC subtract) # 添加subtract库 
    target_include_directories(demo PUBLIC Vcalc) # 将Vcalc目录加入头文件搜索路径 
    
  5. 最后,运行cmake命令来重新生成makefile文件,如下所示:

    cmake .. -G "Generator Name" # 重新生成makefile文件 
    

    上述步骤是解决cmake使用不同编译器出现的错误的方法。通过上述步骤设置了不同的编译器、标准、依赖库以及重新生成makefile文件之后就可以正常的编译代码了。
    如果回答有帮助,望采纳。