C++-20 模块和 CMake 3.28:多个“错误:'wxXXXXXX' 在不同模块中具有不同的定义”错误

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

CMake 3.28 已发布,对 C++ 20 模块提供一流支持(至少使用 Clang >= 17)。 我在构建输出中遇到了几个这样的错误。

[ ... snip ... ]
[build] [10/12] Building CXX object CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o
[build] FAILED: CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o CMakeFiles/Modules.dir/Debug/HS.Util.pcm 
[build] /usr/bin/clang++ -D_FILE_OFFSET_BITS=64 -D__WXGTK__ -DCMAKE_INTDIR=\"Debug\" -I/home/geoffrey/dev/scratch/t/include -I/home/geoffrey/dev/scratch/t/modules -I/home/geoffrey/dev/scratch/t/src/include -I/home/geoffrey/dev/scratch/t/src/modules -I/usr/local/lib64/wx/include/gtk3-unicode-3.3 -isystem /home/geoffrey/dev/sys/vcpkg/installed/x64-linux/include -isystem /usr/local/lib64/wx/include/gtk3-unicode-static-3.3 -isystem /usr/local/include/wx-3.3 -pthread -g -std=c++20 -MD -MT CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o -MF CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o.d @CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o.modmap -o CMakeFiles/Modules.dir/Debug/src/modules/HSUtil.cpp.o -c /home/geoffrey/dev/scratch/t/src/modules/HSUtil.cpp
[build] In file included from /home/geoffrey/dev/scratch/t/src/modules/HSUtil.cpp:35:
[build] In file included from /usr/local/include/wx-3.3/wx/wx.h:23:
[build] In file included from /usr/local/include/wx-3.3/wx/event.h:29:
[build] In file included from /usr/local/include/wx-3.3/wx/any.h:599:
[build] /usr/local/include/wx-3.3/wx/datetime.h:752:17: error: 'wxDateTime' has different definitions in different modules; first difference is defined here found method 'IsValid' with body
[build]   752 |     inline bool IsValid() const { return m_time != wxLongLong(wxINT64_MIN); }
[build]       |     ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[build] /usr/local/include/wx-3.3/wx/datetime.h:752:17: note: but in 'HS.Debug.<global>' found method 'IsValid' with different body
[build]   752 |     inline bool IsValid() const { return m_time != wxLongLong(wxINT64_MIN); }
[build]       |     ~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[ ... snip ... ]

我已经在这个问题上坚持了大约 5 天了。 ChatGPT 和 Bing 没有任何帮助。我已经用静态链接和共享库重建了所有内容,检查了所有编译选项是否兼容,以及人工智能能想到的所有其他内容,但没有成功。 这是我的 CMakeLists.txt

cmake_minimum_required(VERSION 3.28)

set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_COMPILER clang++)
set(CMAKE_SCAN_FOR_MODULES)
set(BUILD_SHARED_LIBS OFF)
set(CMAKE_FIND_LIBRARY_SUFFIXES .a)

set(wxWidgets_CONFIG_EXECUTABLE /usr/local/bin/wx-config)

get_filename_component(PROJECT_ROOT ${CMAKE_CURRENT_LIST_FILE} DIRECTORY)
get_filename_component(PROJECT_NAME ${PROJECT_ROOT} NAME)

# Executable names
set(APP ${PROJECT_NAME})

# Project name
project(${APP} LANGUAGES CXX VERSION 0.1.0)

include_directories(
    "${CMAKE_SOURCE_DIR}/src/include"
    "${CMAKE_SOURCE_DIR}/src/modules"
    "${VCPKG_PATH}/include"
    "/usr/local/lib64/wx/include/gtk3-unicode-3.3"
)

# APP executable
add_executable(${APP}
    src/app.cpp
    src/frame.cpp
)
if(WIN32)
target_sources(${APP} PUBLIC
    ${APP}.rc)
endif(WIN32)

add_library(Modules)
target_sources(Modules PUBLIC FILE_SET CXX_MODULES FILES
    src/modules/HSDebug.cpp
    src/modules/HSUtil.cpp
)

find_package(wxWidgets REQUIRED COMPONENTS core base)
include("${wxWidgets_USE_FILE}")
target_link_libraries(${APP} PRIVATE ${wxWidgets_LIBRARIES})
target_link_libraries(Modules PRIVATE ${wxWidgets_LIBRARIES})

target_link_libraries(${APP} PRIVATE Modules)

大家有什么想法吗?

c++ cmake module clang clang++
1个回答
0
投票

我已经被这个问题困扰了大约 5 天。

这些很难调试。

看起来

wxINT64_MIN

include/wx/defs.h
中可以有不同的定义:

#ifdef LLONG_MAX #define wxINT64_MIN LLONG_MIN ... #else #define wxINT64_MIN (wxLL(-9223372036854775807)-1)
我怀疑当你编译 

HSUtil.cpp

 时,你采用了一个分支,但是当你早些时候编译其他模块时,你采用了另一个分支。

您可以将

#error This should not be used

 添加到一个分支(您认为不应该使用的分支)并编译所有 
没有 模块。

由于添加了

#error

,该构建可能会失败。

现在将

#error

 移至另一个分支并尝试再次重建所有内容。

这可能会

失败,现在您已经确定了两个使用不同定义的来源。

#define LLONG_MIN ...

 可能来自 
<limits.h>
,并且您的一个来源在 
#include <limits.h>
 之前有 
#include <wx/defs.h>
,而另一个来源则没有。

© www.soinside.com 2019 - 2024. All rights reserved.