Fix compile with MSVC

This commit is contained in:
Jonas Kvinge 2021-08-24 17:52:08 +02:00
parent 55e038d345
commit d02241d32c
14 changed files with 114 additions and 59 deletions

View File

@ -35,29 +35,33 @@ set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
list(APPEND COMPILE_OPTIONS
$<$<COMPILE_LANGUAGE:C>:-std=c99>
$<$<COMPILE_LANGUAGE:CXX>:-std=c++17>
-Wall
-Wextra
-Wpedantic
-Wunused
-Wshadow
-Wundef
-Wuninitialized
-Wredundant-decls
-Wcast-align
-Winit-self
-Wmissing-include-dirs
-Wmissing-declarations
-Wstrict-overflow=2
-Wunused-parameter
-Wformat=2
-Wdisabled-optimization
$<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>
$<$<COMPILE_LANGUAGE:CXX>:-Wno-old-style-cast>
$<$<COMPILE_LANGUAGE:CXX>:-fpermissive>
)
if(MSVC)
list(APPEND COMPILE_OPTIONS /std:c++17 /MP)
else()
list(APPEND COMPILE_OPTIONS
$<$<COMPILE_LANGUAGE:C>:-std=c99>
$<$<COMPILE_LANGUAGE:CXX>:-std=c++17>
-Wall
-Wextra
-Wpedantic
-Wunused
-Wshadow
-Wundef
-Wuninitialized
-Wredundant-decls
-Wcast-align
-Winit-self
-Wmissing-include-dirs
-Wmissing-declarations
-Wstrict-overflow=2
-Wunused-parameter
-Wformat=2
-Wdisabled-optimization
$<$<COMPILE_LANGUAGE:CXX>:-Woverloaded-virtual>
$<$<COMPILE_LANGUAGE:CXX>:-Wno-old-style-cast>
$<$<COMPILE_LANGUAGE:CXX>:-fpermissive>
)
endif()
option(BUILD_WERROR "Build with -Werror" OFF)
if(BUILD_WERROR)
@ -307,7 +311,7 @@ if(NOT SPARKLE AND (APPLE OR WIN32))
endif()
endif()
if(WIN32)
if(WIN32 AND NOT MSVC)
# RC compiler
string(REPLACE "gcc" "windres" CMAKE_RC_COMPILER_INIT ${CMAKE_C_COMPILER})
enable_language(RC)
@ -487,6 +491,9 @@ add_definitions(-DQT_NO_CAST_TO_ASCII)
if(WIN32)
add_definitions(-DUNICODE)
if(MSVC)
add_definitions(-DPROTOBUF_USE_DLLS)
endif()
endif()
# Subdirectories

View File

@ -24,7 +24,9 @@
#include <cstring>
#include <iostream>
#include <memory>
#include <cxxabi.h>
#ifndef _MSC_VER
# include <cxxabi.h>
#endif
#include <glib.h>
#ifdef HAVE_BACKTRACE
@ -275,8 +277,8 @@ static T CreateLogger(Level level, const QString &class_name, int line, const ch
return ret.space();
}
#ifdef Q_OS_UNIX
QString CXXDemangle(const QString &mangled_function);
QString CXXDemangle(const QString &mangled_function) {
int status = 0;
@ -289,9 +291,24 @@ QString CXXDemangle(const QString &mangled_function) {
return mangled_function; // Probably not a C++ function.
}
#endif // Q_OS_UNIX
#ifdef Q_OS_LINUX
QString LinuxDemangle(const QString &symbol);
QString LinuxDemangle(const QString &symbol) {
QRegularExpression regex("\\(([^+]+)");
QRegularExpressionMatch match = regex.match(symbol);
if (!match.hasMatch()) {
return symbol;
}
QString mangled_function = match.captured(1);
return CXXDemangle(mangled_function);
}
#endif // Q_OS_LINUX
#ifdef Q_OS_MACOS
QString DarwinDemangle(const QString &symbol);
QString DarwinDemangle(const QString &symbol) {
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
@ -303,23 +320,9 @@ QString DarwinDemangle(const QString &symbol) {
return CXXDemangle(mangled_function);
}
QString LinuxDemangle(const QString &symbol);
QString LinuxDemangle(const QString &symbol) {
QRegularExpression regex("\\(([^+]+)");
QRegularExpressionMatch match = regex.match(symbol);
if (!match.hasMatch()) {
return symbol;
}
QString mangled_function = match.captured(1);
return CXXDemangle(mangled_function);
}
#endif // Q_OS_MACOS
QString DemangleSymbol(const QString &symbol);
QString DemangleSymbol(const QString &symbol) {
#ifdef Q_OS_MACOS
return DarwinDemangle(symbol);

View File

@ -29,12 +29,20 @@
# define qLog(level) while (false) QNoDebug()
# define qLogCat(level, category) while (false) QNoDebug()
#else
# define qLog(level) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, nullptr)
# ifdef _MSC_VER
# define qLog(level) logging::CreateLogger##level(__LINE__, __FUNCSIG__, nullptr)
# else
# define qLog(level) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, nullptr)
# endif // _MSC_VER
// This macro specifies a separate category for message filtering.
// The default qLog will use the class name extracted from the function name for this purpose.
// The category is also printed in the message along with the class name.
# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, category)
# ifdef _MSC_VER
# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __FUNCSIG__, category)
# else
# define qLogCat(level, category) logging::CreateLogger##level(__LINE__, __PRETTY_FUNCTION__, category)
# endif // _MSC_VER
#endif // QT_NO_DEBUG_STREAM

View File

@ -18,10 +18,13 @@
#include "config.h"
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(5, 10, 0)
#include <sys/time.h>
#endif
#include <iostream>
#include <QtGlobal>
#include <QCoreApplication>
#include <QList>
#include <QString>

View File

@ -1179,6 +1179,9 @@ endif()
if(WIN32)
target_link_libraries(strawberry_lib PRIVATE dsound dwmapi)
if(MSVC)
target_link_libraries(strawberry_lib PRIVATE sqlite3)
endif()
endif()

View File

@ -26,6 +26,7 @@
#include <cmath>
#include <QVector>
#include <QtMath>
FHT::FHT(int n) : num_((n < 3) ? 0 : 1 << n), exp2_((n < 3) ? -1 : n) {

View File

@ -22,7 +22,9 @@
#include "version.h"
#include <cstdlib>
#include <getopt.h>
#ifndef _MSC_VER
# include <getopt.h>
#endif
#include <iostream>
#include <type_traits>
@ -119,6 +121,7 @@ void CommandlineOptions::RemoveArg(const QString &starts_with, int count) {
bool CommandlineOptions::Parse() {
#ifndef _MSC_VER // TODO: Consider QCommandLineOption.
static const struct option kOptions[] = {
{"help", no_argument, nullptr, 'h'},
{"play", no_argument, nullptr, 'p'},
@ -319,6 +322,8 @@ bool CommandlineOptions::Parse() {
}
}
#endif // _MSC_VER
return true;
}

View File

@ -613,8 +613,8 @@ void SongLoader::ErrorMessageReceived(GstMessage *msg) {
gchar *debugs = nullptr;
gst_message_parse_error(msg, &error, &debugs);
qLog(Error) << __PRETTY_FUNCTION__ << error->message;
qLog(Error) << __PRETTY_FUNCTION__ << debugs;
qLog(Error) << error->message;
qLog(Error) << debugs;
QString message_str = error->message;

View File

@ -697,7 +697,7 @@ QString GetEnv(const QString &key) {
void SetEnv(const char *key, const QString &value) {
#ifdef Q_OS_WIN32
putenv(QString("%1=%2").arg(key, value).toLocal8Bit().constData());
_putenv(QString("%1=%2").arg(key, value).toLocal8Bit().constData());
#else
setenv(key, value.toLocal8Bit().constData(), 1);
#endif
@ -785,7 +785,19 @@ QString DesktopEnvironment() {
}
QString UnicodeToAscii(const QString &unicode) {
QString UnicodeToAscii(QString unicode) {
#ifdef _MSC_VER
return unicode
.replace(QChar(229), "a")
.replace(QChar(197), 'A')
.replace(QChar(230), "ae")
.replace(QChar(198), "AE")
.replace(QChar(248), 'o')
.replace(QChar(216), 'O');
#else
#ifdef LC_ALL
setlocale(LC_ALL, "");
@ -816,6 +828,8 @@ QString UnicodeToAscii(const QString &unicode) {
return ret;
#endif // _MSC_VER
}
QString MacAddress() {

View File

@ -132,7 +132,7 @@ QString GetRandomString(const int len, const QString &UseCharacters);
QString DesktopEnvironment();
QString UnicodeToAscii(const QString &unicode);
QString UnicodeToAscii(QString unicode);
QString MacAddress();

View File

@ -40,10 +40,12 @@ class DirectSoundDeviceFinder : public DeviceFinder {
QList<Device> devices;
};
static BOOL EnumerateCallback(LPGUID guid,
LPCSTR description,
LPCSTR module,
LPVOID state_voidptr) __attribute__((stdcall));
static BOOL EnumerateCallback(LPGUID guid, LPCSTR description, LPCSTR module, LPVOID state_voidptr)
#ifdef _MSC_VER
;
#else
__attribute__((stdcall));
#endif
};
#endif // DIRECTSOUNDDEVICEFINDER_H

View File

@ -875,7 +875,7 @@ void GstEngine::UpdateScope(const int chunk_length) {
sample_type *dest = scope_.data();
source += (chunk_size / sizeof(sample_type)) * scope_chunk_;
int bytes = 0;
size_t bytes = 0;
// Make sure we don't go beyond the end of the buffer
if (scope_chunk_ == scope_chunks_ - 1) {

View File

@ -22,7 +22,11 @@
#include <windows.h>
#include <initguid.h>
#include <devpkey.h>
#include <functiondiscoverykeys_devpkey.h>
#ifdef _MSC_VER
# include <functiondiscoverykeys.h>
#else
# include <functiondiscoverykeys_devpkey.h>
#endif
#include <mmdeviceapi.h>
#include <QList>
@ -32,6 +36,11 @@
#include "mmdevicefinder.h"
#include "core/logging.h"
#ifdef _MSC_VER
DEFINE_GUID(IID_IMMDeviceEnumerator, 0xa95664d2, 0x9614, 0x4f35, 0xa7, 0x46, 0xde, 0x8d, 0xb6, 0x36, 0x17, 0xe6);
DEFINE_GUID(CLSID_MMDeviceEnumerator, 0xbcde0395, 0xe52f, 0x467c, 0x8e, 0x3d, 0xc4, 0x57, 0x92, 0x91, 0x69, 0x2e);
#endif
MMDeviceFinder::MMDeviceFinder() : DeviceFinder("mmdevice", { "wasapisink" }) {}
QList<DeviceFinder::Device> MMDeviceFinder::ListDevices() {

View File

@ -2164,13 +2164,13 @@ void Playlist::RemoveDeletedSongs() {
namespace {
struct SongSimilarHash {
long operator() (const Song &song) const {
size_t operator() (const Song &song) const {
return HashSimilar(song);
}
};
struct SongSimilarEqual {
long operator()(const Song &song1, const Song &song2) const {
size_t operator()(const Song &song1, const Song &song2) const {
return song1.IsSimilar(song2);
}
};