我的目标是在一个项目中重用一些已经生成的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)
所以我错过了将先前生成的模块注入到项目中的方法。
问题是我该怎么做缺少的部分是什么?
1条答案
按热度按时间gab6jxml1#
参见MSVC的
/reference
编译器参数(https://learn.microsoft.com/en-us/cpp/build/reference/module-reference?view=msvc-170)。我不认为CMake有什么特别的,所以你必须手动设置它,就像这样:据我所知,模块ABI并不稳定-它对于调试和发布以及对于不同的编译器都是不同的,甚至可能对于不同的编译器版本/ MSVC工具包版本都是不同的