cmake C++20重用已经编译好的模块?

9gm1akwq  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(145)

我的目标是在一个项目中重用一些已经生成的c++20模块到另一个项目中。
我尝试了下面的github repo和模块使用工作得很好。

生成模块文件的第一个项目:

我决定将Cmake结构改为:

cmake_minimum_required(VERSION 3.26)

set(APP_NAME CppModules)

project(${APP_NAME} LANGUAGES CXX)

set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")

set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_EXTENSIONS Off)

add_executable(${APP_NAME} main.cpp)

add_library(my_lib2)
target_sources(my_lib2
  PUBLIC
    FILE_SET cxx_modules TYPE CXX_MODULES FILES
    src/my_lib/my_lib2.cpp
)
add_library(my_lib)
target_sources(my_lib
  PUBLIC
    FILE_SET cxx_modules TYPE CXX_MODULES FILES
    src/my_lib/my_lib.cpp
)

target_link_libraries(${APP_NAME} PRIVATE my_lib my_lib2 )

set_target_properties(${APP_NAME} PROPERTIES LINKER_LANGUAGE CXX)

现在,我已经生成了一些.pcm文件和一些{my_lib,mylib 2}.a文件。

第二个项目尝试包含:

这是第二个试图导入模块的项目的结构:

import my_lib;

int main() {
    foo f;
    f.helloworld();
    return 0;
}

但是那个程序抱怨

fatal error: module 'my_lib' not found

即使我有以下cmake文件:

cmake_minimum_required(VERSION 3.26)

set(APP_NAME Importer)

project(${APP_NAME} LANGUAGES CXX)

set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")

set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_EXTENSIONS Off)

add_executable(${APP_NAME} main.cpp)

target_link_libraries(${APP_NAME} PRIVATE /absolute/path/to/libmy_lib.a)

set_target_properties(${APP_NAME} PROPERTIES LINKER_LANGUAGE CXX)

所以我错过了将先前生成的模块注入到项目中的方法。
问题是我该怎么做缺少的部分是什么?

gab6jxml

gab6jxml1#

参见MSVC的/reference编译器参数(https://learn.microsoft.com/en-us/cpp/build/reference/module-reference?view=msvc-170)。我不认为CMake有什么特别的,所以你必须手动设置它,就像这样:

target_compile_options(${PROJECT_NAME} PUBLIC /reference "mymodule.ifc")

据我所知,模块ABI并不稳定-它对于调试和发布以及对于不同的编译器都是不同的,甚至可能对于不同的编译器版本/ MSVC工具包版本都是不同的

相关问题