MA C: Qt не может обнаружить инструментарий - PullRequest
2 голосов
/ 23 января 2020

Screen

Как я могу настроить QT Project с использованием Qt 5.12.1 / Qt Creator 4.8.1
Мне нужно скомпилировать мой проект для ma c os.
Я попробовал с QT Creator, затем возникла следующая проблема.

Или скомпилируйте с помощью следующей команды.

qmake
make

Но возникает ошибка ниже.

third_party/wfdbio.cpp:181:5: fatal error: assigning to 'char *' from
      incompatible type 'void *'
    SSTRCPY(wfdbpath, wfdbpath_init);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
third_party/wfdb.h:234:3: note: expanded from macro 'SSTRCPY'
         SALLOC(P, (size_t)strlen(WFDB_tmp)+1,1); strcpy(P, WFDB_tmp); } }
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
third_party/wfdb.h:231:37: note: expanded from macro 'SALLOC'
#define SALLOC(P, N, S) { SFREE(P); SUALLOC(P, (N), (S)) }
                                    ^~~~~~~~~~~~~~~~~~~~
third_party/wfdb.h:230:38: note: expanded from macro 'SUALLOC'
#define SUALLOC(P, N, S) { if (!(P = calloc((N), (S)))) MEMERR(P, (N), (S)); }
                                     ^~~~~~~~~~~~~~~~
1 error generated.
make: *** [objects/wfdbio.o] Error 1

Error Screen2 Конечно, я могу изменить некоторый код с помощью Typecast, например.) char* to void*.
Но, есть много макросов и кодов, поэтому необходимо много изменений кода для "удаление типа приведения".
Конечно, я использовал флаги "-fpermissive", и мой проект скомпилирован в Windows 10.

Итак, как я могу скомпилировать свой проект без изменения кода?

РЕДАКТИРОВАТЬ:

Вот MRE моей проблемы:

#include <stdio.h>
#include <stdlib.h> 
int main()
{
    char *buffer;

    printf("How long do you want the string? ");

    buffer = malloc(10);
    // buffer = (char* ) malloc(10);

    return 0;
}

Этот код скомпилирован в Windows10 Cygwin .

# At Cygwin, gcc version is
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-pc-cygwin/7.4.0/lto-wrapper.exe
Target: x86_64-pc-cygwin
Configured with: /cygdrive/i/szsz/tmpp/gcc/gcc-7.4.0-1.x86_64/src/gcc-7.4.0/configure --srcdir=/cygdrive/i/szsz/tmpp/gcc/gcc-7.4.0-1.x86_64/src/gcc-7.4.0 --prefix=/usr --exec-prefix=/usr --localstatedir=/var --sysconfdir=/etc --docdir=/usr/share/doc/gcc --htmldir=/usr/share/doc/gcc/html -C --build=x86_64-pc-cygwin --host=x86_64-pc-cygwin --target=x86_64-pc-cygwin --without-libiconv-prefix --without-libintl-prefix --libexecdir=/usr/lib --enable-shared --enable-shared-libgcc --enable-static --enable-version-specific-runtime-libs --enable-bootstrap --enable-__cxa_atexit --with-dwarf2 --with-tune=generic --enable-languages=ada,c,c++,fortran,lto,objc,obj-c++ --enable-graphite --enable-threads=posix --enable-libatomic --enable-libcilkrts --enable-libgomp --enable-libitm --enable-libquadmath --enable-libquadmath-support --disable-libssp --enable-libada --disable-symvers --with-gnu-ld --with-gnu-as --with-cloog-include=/usr/include/cloog-isl --without-libiconv-prefix --without-libintl-prefix --with-system-zlib --enable-linker-build-id --with-default-libstdcxx-abi=gcc4-compatible --enable-libstdcxx-filesystem-ts
Thread model: posix
gcc version 7.4.0 (GCC)

Но я не могу скомпилировать на моей ОС Ma c.

Ниже приведен код ошибки.

Ws-Mac:Desktop w$ gcc test.cpp -fpermissive
test.cpp:9:14: error: assigning to 'char *' from incompatible type 'void *'
    buffer = malloc(10);
             ^~~~~~~~~~
1 error generated.
# At Mac OS, gcc version is
Ws-Mac:Desktop w$ gcc -v
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
Target: x86_64-apple-darwin18.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
Ws-Mac:Desktop w$ 

Ответы [ 2 ]

3 голосов
/ 28 января 2020

Это связано с тем, что C и C ++ обрабатывают преобразования в a из void *. В C любой тип указателя может быть свободно преобразован в / из void * без приведения. C ++ не допускает этого и выдаст ошибку, если вы попытаетесь выполнить преобразование без приведения.

Код в вашем примере - это код C, но имя файла заканчивается на. cpp, поэтому g cc компилирует код как C ++. Таким образом, эта строка:

buffer = malloc(10);

генерирует ошибку, поскольку C ++ не допускает неявное void * преобразование.

Если вы изменили имя файла с test. cpp на test. c он будет скомпилирован чисто.

Возвращаясь к вашему проекту QT, поскольку QT - это библиотека C ++, вы не можете просто попытаться скомпилировать весь код как C код.

Если модули с такими ошибками содержат код only C, вы можете изменить имя файла этих модулей с. cpp на. c, и вам потребуется изменить связанные заголовочные файлы, добавив extern "C" вокруг объявлений функций. Если эти ошибки появляются в модулях, которые на самом деле являются C ++, вам нужно изменить код, чтобы использовать static_cast<char*>, чтобы присвоить возвращаемое значение malloc / calloc / realloc для char *.

2 голосов
/ 28 января 2020

Простой ответ - «не используйте malloc в c ++», если вы используете new, вместо этого проблема исчезает, и в качестве бонуса вы правильно инициализируете классы.

Если вам действительно нужно использовать malloc вы не можете избежать необходимости static_cast результата в соответствующий тип.

Если вы действительно не хотите добавлять stati c приведение повсюду, тогда может сработать что-то подобное:

struct mymalloc
{
    mymalloc(size_t size)
    : data(malloc(size))
    {
    }
    mymalloc(const mymalloc&) = delete;
    mymalloc& operator=(const mymalloc&) = delete;

    void* data;

    template <typename T>
    operator T*()
    {
        return static_cast<T*>(data);
    }
};

int main()
{
    char *buffer = mymalloc(10);
    free(buffer);

    return 0;
}

Вы могли бы даже иметь некоторый успех с #define malloc mymalloc, но вам нужно быть очень осторожным, чтобы не сломать что-либо еще, делая это.

Я повторяю, что правильным решением является переключиться с malloc на new и избежать всего этого хакерства.

...