如何在 Windows 64 位机器上将 c++ 应用程序编译成 x64 模式?

Posted

技术标签:

【中文标题】如何在 Windows 64 位机器上将 c++ 应用程序编译成 x64 模式?【英文标题】:How to compile c++ application into x64 mode in Windows 64bit machine? 【发布时间】:2016-04-14 13:14:28 【问题描述】:

我已经安装了 Windows SDK 7.1 平台工具,并打开了一个名为 Microsoft Windows 7 x64 Debug Build Environment 的终端。现在我想使用cl.exe 命令编译一个C++ 应用程序(名为main.cpp)。编译命令为:

    cl main.cpp

然后,它会输出main.objmain.exe 文件。但是当我尝试运行main.exe 时,它在begin computing dist 之后和end computing dist. 之前崩溃了,我想我应该将应用程序编译成x64 程序。请问有大神给点建议吗?

main.cpp如下:

    #include <cstdio>
    #include <cstdlib>
    #ifdef _MSC_VER
    typedef unsigned __int32 uint32_t;
    typedef unsigned __int64 uint64_t;
    #include <intrin.h>
    #include <windows.h>
    #else
    #include <stdint.h>
    #include <sys/time.h>
    #include <unistd.h>
    #endif

    int main(int argc, char **argv) 

    int nTrn = 10;
    int nTst = 10;
    int nDim = 1; // 64 bit
    printf("allocate memory for feats.\n");
    uint64_t *trn_feat = new uint64_t[nTrn]; // nTrn x nDim
    uint64_t *tst_feat = new uint64_t[nTst]; // nTst x nDim

    printf("initialize the feats.\n");
    for(int i=0; i<nTrn; i++)
        trn_feat[i] = (((uint64_t) rand() <<  0) & 0x000000000000FFFFull) | 
                      (((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) | 
                      (((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
                      (((uint64_t) rand() << 48) & 0xFFFF000000000000ull);
    for(int i=0; i<nTst; i++)
        tst_feat[i] = (((uint64_t) rand() <<  0) & 0x000000000000FFFFull) | 
                      (((uint64_t) rand() << 16) & 0x00000000FFFF0000ull) | 
                      (((uint64_t) rand() << 32) & 0x0000FFFF00000000ull) |
                      (((uint64_t) rand() << 48) & 0xFFFF000000000000ull);

    printf("allocate memory for dist matrix.\n");
    uint64_t *dist = new uint64_t[nTrn*nTst];

    #ifdef _MSC_VER
    LARGE_INTEGER StartingTime, EndingTime, ElapsedMicroseconds;
    LARGE_INTEGER Frequency;
    QueryPerformanceFrequency(&Frequency);
    QueryPerformanceCounter(&StartingTime);
    #else
    struct timeval start, end;
    long seconds, useconds;
    double mtime;
    gettimeofday(&start, NULL);
    #endif

    printf("begin computing dist.\n");
    for(int iter=0; iter<100; iter++) 
        for(int i=0; i<nTrn; i++) 
             for(int j=0; j<nTst; j++) 
                 uint64_t n = (trn_feat[i] ^ tst_feat[j]);
    #ifdef _MSC_VER
                 dist[i*nTst + j] = __popcnt64(n);
    #else
                 dist[i*nTst + j] = __builtin_popcountll(n);
    #endif
                  
        
    
    printf("end computing dist.\n");

    #ifdef _MSC_VER
    QueryPerformanceCounter(&EndingTime);
    ElapsedMicroseconds.QuadPart = EndingTime.QuadPart - StartingTime.QuadPart;
    ElapsedMicroseconds.QuadPart *= 1000000;
    ElapsedMicroseconds.QuadPart /= Frequency.QuadPart;
    double mtime = (double)ElapsedMicroseconds.QuadPart;
    printf("Average time: %.6f nanoseconds\n", (1e6*mtime)/100/(nTrn*nTst));
    #else
    gettimeofday(&end, NULL);
    seconds = end.tv_sec - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;
    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;
    printf("Total elapsed time: %.6f milliseconds\n", mtime);
    printf("Average time: %.6f nanoseconds\n", (1e6*mtime)/1000/(nTrn*nTst));
    #endif

    delete[] trn_feat;
    delete[] tst_feat;
    delete[] dist;

    

【问题讨论】:

那么你的问题是什么?如何指定目标平台?如何修复你的错误? @IInspectable,谢谢!代码中有错误吗?看来Ubuntu中的代码可以正常运行了。 您没有为 Windows 和 Ubuntu 编译相同的代码,那么程序在 Ubuntu 上运行良好的事实如何表明它不包含错误? @IInspectable,在添加Windows代码之前,我可以在Ubuntu中运行正常。 嗨,@IInspectable,我已经尝试在 Ubuntu 中再次编译代码,它可以运行正常。你能指出错误在哪里吗?谢谢! 【参考方案1】:

以下是可能的答案:

    安装Visual Studio Community 2015Visual Studio Group 打开Visual Studio x64 terminal cl.exe main.cpp /link /machine:x64

然后输出一个main.exe

要运行main.exe,有两个必要条件:

    机器或CPU可以支持__popcnt64指令集。查看机器是否支持,请参考__cpuid。 Windows 操作系统为 64 位。

【讨论】:

以上是关于如何在 Windows 64 位机器上将 c++ 应用程序编译成 x64 模式?的主要内容,如果未能解决你的问题,请参考以下文章

Firefox在64位Windows系统上将默认下载64位

尝试在 64 位机器上将 Detours.lib 编译为 32 位:LNK1112:模块机器类型“x86”与目标机器类型“x64”冲突

在 64 位机器上注册 C++ DLL

用于 64 位 Windows 7 机器的 Microsoft ODBC 驱动程序的替代品(将 Excel 数据获取到 SQL)

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?

32位机上用vs2008开发的c++程序如何能在64位系统下运行?