无法使用 opencv 和模块构建 C++ 20 项目

问题描述 投票:0回答:1

我正在尝试使用 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") 
,但无济于事。

c++ opencv cmake c++20
1个回答
0
投票

错误信息表明找不到编译好的模块文件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})
© www.soinside.com 2019 - 2024. All rights reserved.