首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MAC: Qt无法检测工具包

MAC: Qt无法检测工具包
EN

Stack Overflow用户
提问于 2020-01-23 13:43:08
回答 2查看 303关注 0票数 2

如何使用QT5.12.1/ QT 4.8.1配置Qt项目

我需要为mac操作系统编译我的项目。

我尝试了,然后,出现了下面的问题。

或使用以下命令进行编译。

代码语言:javascript
运行
复制
qmake
make

但是,出现了以下错误。

代码语言:javascript
运行
复制
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

当然,我可以用typecast,例如) char* to void*修改一些代码。

但是,有许多宏和代码,因此,许多代码更改是需要“删除类型转换”。

当然,我使用了"-fpermissive“标志,我的项目是在Windows 10上编译的。

那么,如何在不更改代码的情况下编译我的项目呢?

编辑:

下面是我的问题的MRE:

代码语言:javascript
运行
复制
#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 西格温编译的。

代码语言:javascript
运行
复制
# 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)

但是,我不能在我的Mac上编译。

下面是错误代码。

代码语言:javascript
运行
复制
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.
代码语言:javascript
运行
复制
# 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$ 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-28 13:31:07

这是因为C和C++处理从void *转换到a的方式不同。在C中,任何指针类型都可以自由地转换为/来自void *,而不需要强制转换。C++不允许这样做,如果您试图在没有强制转换的情况下进行转换,则会引发错误。

示例中的代码是C代码,但文件名以.cpp结尾,因此gcc将代码编译为C++。所以这句话:

代码语言:javascript
运行
复制
buffer = malloc(10);

生成错误,因为C++不允许隐式void *转换。

如果您将文件名从test.cpp更改为test.c,它将清清楚楚地编译。

回到您的QT项目,因为QT是一个C++库,所以不能仅仅将所有代码编译为C代码。

如果有这些错误的模块只包含C代码,那么可以将这些模块的文件名从.cpp更改为.c,并且需要修改相关的头文件以在函数声明周围添加extern "C"。如果这些错误出现在实际上是C++的模块中,那么您需要更改代码以使用static_cast<char*>将C++的返回值分配给char *

票数 3
EN

Stack Overflow用户

发布于 2020-01-28 14:16:19

简单的答案是“不要在c++中使用new”,如果您使用new代替,那么问题就消失了,而且作为一种奖励,您正确地初始化了类。

如果您确实必须使用malloc,则无法避免将结果转换为适当类型的需要。

如果您真的不想在任何地方添加静态强制转换,那么类似这样的内容可能会奏效:

代码语言:javascript
运行
复制
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,并避免所有这些黑客行为。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59880002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档