Open CHN-STUDENT opened 8 months ago
Finally, I solved the problem on qt6 by modifying CMakeLists.txt
and source code qcron.hpp
.
cmake_minimum_required(VERSION 3.0)
# Project name.
set(PROJECT qcron)
project(${PROJECT})
set(SOURCE_DIR ${CMAKE_SOURCE_DIR}/src)
set(ARCHIVE_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/lib)
set(LIBRARY_OUTPUT_DIR ${CMAKE_SOURCE_DIR}/lib)
set(PUBLIC_HEADER_DIR ${CMAKE_SOURCE_DIR}/include)
if (WIN32)
set(CMAKE_INSTALL_PREFIX ${CMAKE_SOURCE_DIR}/install)
endif()
set(${PROJECT}_INCLUDE_DIR
${SOURCE_DIR} CACHE STRING "${PROJECT} include directory")
# -Wmissing-declarations delete because it would not make Qt Resource
# Files compiles
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wredundant-decls \
-Wcast-align -Wmissing-include-dirs -Wswitch-enum -Wswitch-default \
-Wextra -Wall -Werror -Winvalid-pch -Wredundant-decls -Wformat=2 \
-Wmissing-format-attribute -Wformat-nonliteral")
option(WITH_UNIT_TESTS "enable building unit test executable" OFF)
#option(WITH_BENCHMARK "enable building benchmark executable" OFF)
# Dependencies
set(QT_COMPONENTS Core Test)
# Enable CMake AUTOMOC
set(CMAKE_AUTOMOC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
# 添加定义 BUILD_QCRON_LIB,用于导出类
add_definitions(-DBUILD_QCRON_LIB)
# Find Qt version
find_package(Qt6 COMPONENTS Core QUIET)
if(Qt6_FOUND)
message(STATUS "Using Qt6")
set(QT_VERSION_MAJOR 6)
find_package(Qt6 COMPONENTS ${QT_COMPONENTS} REQUIRED)
else()
message(STATUS "Using Qt5")
set(QT_VERSION_MAJOR 5)
find_package(Qt5 COMPONENTS ${QT_COMPONENTS} REQUIRED)
endif()
# Source
add_subdirectory(src)
if(WITH_UNIT_TESTS)
enable_testing()
add_subdirectory(test)
endif()
Without modified qcron.hpp
, when try to link my project, it told me the QCron 's signals: activated() not found. So i search this issue on internet, and a Chinese blog told me i need to declarations in the in src to make linking dynamic library correctly.
#ifndef _QCRON_HPP
#define _QCRON_HPP
// 定义导入导出宏
#ifdef BUILD_QCRON_LIB
#define QCRON_EXPORT Q_DECL_EXPORT
#else
#define QCRON_EXPORT Q_DECL_IMPORT
#endif
#include <QObject>
#include <QDateTime>
#include "qcronfield.hpp"
class QCRON_EXPORT QCron : public QObject
{
Q_OBJECT
public:
QCron();
QCron(const QString & pattern);
~QCron();
// Accessors.
bool isValid() const
{ return _is_valid; }
const QString & error() const
{ return _error; }
// Features.
QDateTime next();
QDateTime next(QDateTime dt);
void catchUp(QDateTime & dt, EField field, int value);
bool match(const QDateTime & dt) const;
void add(QDateTime & dt, EField field, int value);
signals:
void activated();
void deactivated();
private:
bool _is_valid;
bool _is_active;
QString _error;
QCronField _fields[6];
void _init();
void _setError(const QString & error);
void _parsePattern(const QString & pattern);
void _parseField(QString & field_str,
EField field);
QString _validCharacters(EField field);
void _process(QDateTime & dt, EField field);
private slots:
void _checkState();
};
#endif
myproject CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(opcTrans LANGUAGES CXX)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Sql)
include_directories("D:/qtproject/myproject/qcron/include")
link_directories("D:/qtproject/myproject/qcron/lib")
add_executable(myproject main.cpp)
target_link_libraries (myproject Qt${QT_VERSION_MAJOR}::Core)
target_link_libraries (myproject QCron)
include(GNUInstallDirs)
install(TARGETS myproject
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
To use:
std::unique_ptr<QCron> cron = std::make_unique<QCron>("* * * * * *"); // every 1min
QObject::connect(cron.get(), &QCron::activated, [&]() {
qDebug() << "run!" ;
});
But could you add second parse support, i think it will be useful for us. @mankalas @Lu-Gru
Hi, i try to use this lib in my project, but i am using qt6, not qt5, could you add qt support?