初学者第一次使用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
还有一个错是因为第一个错引发的,就不包含了
求有人指出错误,感激不尽