Этот вопрос закрыт для ответов, так как повторяет вопрос Как реализовать кроссплатформенное ПО с библиотеками для Windows/Linux?
@WayMax

Как правильно собрать кроссплатформенный проект?

Файл "MyClass_L.cpp"
#include "MyClass_L.h"
MyClass::MyClass()
{
// реализация для линукса
}


Файл "MyClass_W.cpp"
#include "MyClass_W.h"
MyClass::MyClass()
{
// реализация для винды
}


Файл "MyProgramm.h"
#if defined(Q_OS_LINUX)
    #include "MyClass_L.h"
#elif defined(Q_OS_WIN)
    #include "MyClass_W.h"
#endif


Файл "MyProgramm.cpp"
MyClass *myClass = new MyClass();

При сборке проекта компилятор ругается:
ошибка: multiple definition of `MyClass::MyClass()'


Как правильно собрать такой проект в Qt?
Или только "колхозить" с разными именами классов? (тогда придется еще кучу раз писать #if defined(Q_OS_LINUX) #elif defined(Q_OS_WIN) #endif)
Или можно как-то сделать с разными именами классов но без "колхоза"?

Для недалеких людей: вопрос НЕ похож на Как реализовать кроссплатформенное ПО с библиотеками для Windows/Linux? т.к. ответ в том вопросе не компилится, и этот вопрос заключается в том как тот код скомпилить.
  • Вопрос задан
  • 360 просмотров
Решения вопроса 2
MAKAPOH
@MAKAPOH
многостаночник
Я в своих мелких проектах пишу примерно так (система сборки qbs):
Group {
        name: "cpp_os_specific"
        prefix: "src/cpp/utils/"
        files: {
            if (qbs.targetOS.contains("windows"))
                return ["utils_windows.cpp", "utils.h"];
            if (qbs.targetOS.contains("linux"))
                return ["utils_linux.cpp", "utils.h"];
        }
    }

Соответственно при сборке на разных платформах просто используются разные файлы, никаких разных имён классов или #if defined не нужно.
Насколько это может быть удобно/неудобно на больших проектах не знаю.

P.S.
По поводу qbs, к сожалению генератора проектов из Qt Creator, нет. По крайней мере раньше не было, я давно туда не заглядывал. Но если написать файл проекта руками то он нормально открывается в Qt Creator (qbs плагин обычно включён по умолчанию).
Пример файла сборки qbs:
spoiler
import qbs 1.0

Product {
    type: "application"
    name: "timer_qml"
    consoleApplication: false

    Group {
        name: "cpp"
        prefix: "src/cpp/"
        files: ["*.cpp", "*.h"]
    }

    Group {
        name: "cpp_os_specific"
        prefix: "src/cpp/utils/"
        files: {
            if (qbs.targetOS.contains("windows"))
                return ["utils_windows.cpp", "utils.h"];
            if (qbs.targetOS.contains("linux"))
                return ["utils_linux.cpp", "utils.h"];
        }
    }

    Group {
        name: "resources_and_qml"
        prefix: "src/qrc/"
        files: ["*.qrc", "*.qml"]
    }

    Depends {
        name: "Qt"
        submodules: {
            if (qbs.targetOS.contains("windows"))
                return ["core", "widgets", "gui", "sql", "quick", "qml"];
            if (qbs.targetOS.contains("linux"))
                return ["core", "widgets", "gui", "sql", "quick", "qml", "x11extras"];
        }
    }

    Depends {
        name: "cpp"
    }
    cpp.staticLibraries: {
        if (qbs.targetOS.contains("windows"))
            return ["user32"];
        else
            return [];
    }
    cpp.cxxFlags: {
        if (qbs.toolchain.contains("gcc") || qbs.toolchain.contains("mingw"))
            return ["-std=c++11"];
        else
            return [];
    }
    cpp.dynamicLibraries: {
        if (qbs.targetOS.contains("linux"))
            return ["Xss", "X11"];
        else
            return [];
    }

    Group {
        name: "App itself"
        fileTagsFilter: parent.type
        qbs.install: true
        qbs.installDir: "bin"
    }
}


По официальной документации можно за пару вечеров освоить.
Ответ написан
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
MyClass_L.cpp и MyClass_W.cpp нужно тоже целиком завернуть в ifdef
Либо, что наверно более правильно, надо сказать вашей системе сборки (qmake я так понимаю), что надо собирать только нужные cpp.
doc.qt.io/archives/qt-4.8/qmake-tutorial.html "Adding Platform-Specific Source Files"
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы