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)
大家有什么想法吗?
我已经被这个问题困扰了大约 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>
,而另一个来源则没有。