我正在尝试使用 opencv 启动一个 C++ 20 项目,并希望使用模块而不是普通的
.hpp
文件。
当我运行构建命令时
make
我收到错误:
Hello: error: failed to read compiled module: No such file or directory
Hello: note: compiled module file is ‘gcm.cache/Hello.gcm’
Hello: note: imports must be built before being imported
Hello: fatal error: returning to the gate for a mechanical issue
compilation terminated.
我对此感到困惑,因为任何地方都没有
gcm.cache
。我尝试使用没有 opencv 的模块来做一个项目,并且在主目录中填充了gcm.cache/Hello.gcm
。
此外,该项目无需使用
import
并删除 .cppm
文件即可正常编译。
我的main.cpp
文件是(这是从opencv教程复制的:
#include <cstdio>
#include <opencv4/opencv2/opencv.hpp>
import Hello;
using namespace cv;
int main(int argc, char** argv )
{
hello();
if ( argc != 2 )
{
printf("usage: DisplayImage.out <Image_Path>\n");
return -1;
}
Mat image;
image = imread( argv[1], IMREAD_COLOR );
if ( !image.data )
{
printf("No image data \n");
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", image);
waitKey(0);
return 0;
}
我尝试导入的模块是
Hello.cppm
:
module;
#include <iostream>
export void hello() {
std::cout << "Hello World!\n";
}
我的
CmakeLists.txt
文件是:
cmake_minimum_required(VERSION 3.27)
project(modality)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "-fmodules-ts")
add_executable(modality main.cpp
modules/chemistry/coppersulfate.cpp
Hello.cppm
)
find_package( OpenCV REQUIRED )
include_directories( ${OpenCV_INCLUDE_DIRS} )
target_link_libraries( modality ${OpenCV_LIBS} )
我尝试添加不同的
set()
设置,例如set(CMAKE_CXX_FLAGS "-fmodules-ts")
,但无济于事。
错误信息表明找不到编译好的模块文件Hello.gcm。这通常意味着在处理 import 语句之前模块 Hello 尚未编译。您可能需要调整 CMakeLists.txt 以正确处理模块编译。以下是如何设置的示例:
cmake_minimum_required(VERSION 3.27)
project(modality)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmodules-ts")
find_package(OpenCV REQUIRED)
add_executable(modality main.cpp modules/chemistry/coppersulfate.cpp)
target_precompile_headers(modality PRIVATE Hello.cppm)
target_include_directories(modality PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(modality PRIVATE ${OpenCV_LIBS})