fineal_lt 2025-09-29 20:48 采纳率: 100%
浏览 5
已结题

CMake构建包含modules的目标时搜索不到依赖文件(.ifc)

初学者第一次使用cmake,想构建包含c++20以上的modules模块的库,生成时提示找不到模块,经排查可能是找不到ifc文件(就是MSVC下模块接口文件编译后的中间文件,导入这个接口就需要它),以下可能有术语的使用不当和我项目的配置不当,请指出

这是我的文件组织
FinealTooL
-fil_file
——FT_ff_cmake.cmake
——genericfile.cpp
——genericfile.cppm
-CMakeLists.txt
out
-CMakeLists.txt
-test.cpp

cmake版本是支持模块的,VS ide也是最新的

这是out文件夹下的CMakeLists.txt,也是根文件

cmake_minimum_required (VERSION 3.23)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

# Enable Hot Reload for MSVC compilers if supported.
if(MSVC)
    if (POLICY CMP0141)
      cmake_policy(SET CMP0141 NEW)
      set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<IF:$<AND:$<C_COMPILER_ID:MSVC>,$<CXX_COMPILER_ID:MSVC>>,$<$<CONFIG:Debug,RelWithDebInfo>:EditAndContinue>,$<$<CONFIG:Debug,RelWithDebInfo>:ProgramDatabase>>")
    endif()
endif()

project ("Fineal")

add_subdirectory(FinealTooL)

add_executable(myApp "out/test.cpp")

target_link_libraries(myApp PRIVATE fil_all)

这是FinealTooL文件夹下的CMakeLists.txt:

project ("FinealTooL")

add_library(fil_all STATIC)

if(MSVC)
    target_compile_options(fil_all PRIVATE 
        #"/experimental:module"
        "/TP"
        "/permissive-" 
    )
endif()

include(${CMAKE_CURRENT_SOURCE_DIR}/fil_file/FT_ff_cmake.cmake)

ff_bePartIn_Project(fil_all)

set_target_properties(fil_all PROPERTIES
    #CXX_MODULE_DIR "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/fil_all.dir"
    ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/lib"  # 静态库输出路径(自定义)
)

FT_ff_cmake.cmake:

function(ff_bePartIn_Project projectName)
    target_sources(
        ${projectName}
        PUBLIC 
            FILE_SET cxx_modules TYPE CXX_MODULES
            BASE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}"
            FILES 
                "fil_file/genericfile.cppm"
    )
    target_sources(
        ${projectName}
        PRIVATE    
            "${CMAKE_CURRENT_SOURCE_DIR}/fil_file/genericfile.cpp"
    )

    #set_source_files_properties(
    #    "${CMAKE_CURRENT_SOURCE_DIR}/fil_file/genericfile.cpp"
    #    PROPERTIES
    #        OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/fil_all.dir/genericfile.ifc"
    #)

endfunction()

接下来是代码文件,我只写了sayhello来测试

test.cpp:

import genericfile;

int main() {
    sayHello();
}

genericfile.cppm:

export module genericfile;

export void sayHello();

genericfile.cpp:

module;
#include<iostream>
module genericfile;
using namespace std;
void sayHello() {
    cout << "Hello World!\n";
}

这是报错:
1、C2230 无法找到模块“genericfile” D:\FinealTooL\out\build\x64-debug\FinealTooL D:\FinealTooL\out\test.cpp 1
2、C2230 无法找到模块“genericfile” D:\FinealTooL\out\build\x64-debug\FinealTooL D:\FinealTooL\FinealTooL\fil_file\genericfile.cpp 3

还有一个错是因为第一个错引发的,就不包含了
求有人指出错误,感激不尽

  • 写回答

6条回答 默认 最新

  • fineal_lt 2025-09-29 21:07
    关注

    找到解决方法了,在FT_ff_cmake.cmake中添加这样一条:
    '''c target_compile_options(${projectName} PUBLIC "/module:search ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/fil_all.dir")'''
    就好了,这个方法之前试过,但是后面的编译选项格式不对失败了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 10月7日
  • 已采纳回答 9月29日
  • 创建了问题 9月29日