代码可以用 VS 编译,但不能用 MinGW

Posted

技术标签:

【中文标题】代码可以用 VS 编译,但不能用 MinGW【英文标题】:Code compiles with VS but not with MinGW 【发布时间】:2016-02-23 11:57:12 【问题描述】:

我正在使用不是我创建的库。该代码使用 VS2015 编译并按原样使用 VS2015 运行。我想用 MinGW GCC 编译器编译它,最终让它在一台更大的计算机上运行,​​该计算机在 Linux 上运行并使用 GCC 编译器。该库应适用于 VS、适用于 Windows 的 MinGW 和适用于 Linux 的 GCC。 但是,当我尝试在 Code::Blocks 中编译它时,我收到以下错误消息:

||=== 构建:全部在 Chrono(编译器:GNU GCC 编译器)===| C:\Chrono\chrono_source\src\chrono\parallel\ChThreadsSync.h||在成员函数'void ChSpinlock::Lock()'中:| C:\Chrono\chrono_source\src\chrono\parallel\ChThreadsSync.h|81|错误:'YieldProcessor' 未在此范围内声明| C:\Chrono\chrono_source\src\chrono\parallel\ChThreadsSync.h|83|错误:“ReadWriteBarrier”未在此范围内声明| C:\Chrono\chrono_source\src\chrono\parallel\ChThreadsSync.h||在成员函数 'void ChSpinlock::Unlock()':| C:\Chrono\chrono_source\src\chrono\parallel\ChThreadsSync.h|88|错误:“ReadWriteBarrier”未在此范围内声明| src\chrono\CMakeFiles\ChronoEngine.dir\build.make|462|目标“src/chrono/CMakeFiles/ChronoEngine.dir/physics/ChMarker.cpp.obj”的配方失败| CMakeFiles\Makefile2|1040|目标“src/chrono/CMakeFiles/ChronoEngine.dir/all”的配方失败| C:\Chrono\Chrono_CodeBlocks\Makefile|159|目标“全部”的配方失败| ||=== 构建失败:6 个错误,0 个警告(0 分钟,4 秒)===|

出现错误的部分代码如下:

#define EBUSY 16
#pragma intrinsic(InterlockedExchange)
#pragma intrinsic(ReadWriteBarrier)

/// Class that wraps a spinlock, a very fast locking mutex
/// that should be used only for short wait periods.
/// This uses MSVC intrinsics to mimic a fast spinlock as
/// in pthreads.h, but without the need of including
/// the pthreads library for windows.
/// See http://locklessinc.com/articles/pthreads_on_windows/
class ChApi ChSpinlock 
  public:
ChSpinlock()  lock = 0; 
~ChSpinlock() 
void Lock() 
    while (InterlockedExchange(&lock, EBUSY)) 
        /* Don't lock the bus whilst waiting */
        while (lock) 
            YieldProcessor();
            /* Compiler barrier.  Prevent caching of *l */
            ReadWriteBarrier();
        
    

void Unlock() 
    ReadWriteBarrier();
    lock = 0;


  private:
typedef long pseudo_pthread_spinlock_t;
pseudo_pthread_spinlock_t lock;
;

因此,据我所知,它是让它在 VisualStudio 上运行的一些代码。 我的问题是,如何使用 MinGW 编译器进行编译?

【问题讨论】:

这是C++ 不是CC 没有课程,所以请正确标记您的问题。 您不能使用在 Linux 上的 gcc 编译器中没有出现的任何 Microsoft 独有的 Visual Studio/VC++ 功能。你必须坚持使用 ANSI C++。 这些都是避免使用pthreads.h的变通方法。在 Linux 上,您可能想要使用 pthread。 感谢您的回答。是否有任何方法可以解决此问题,或者此代码是否只是“锁定”到 Visual Studio 编译器? Mayby 通过在代码中包含pthreads.h 【参考方案1】:

这看起来不像是库问题,而是写在那个文件中的代码。您需要删除任何特定于 MSVC 的内容,例如 #pragma intrinsic()

请参阅here,了解致力于将代码移植到 GCC 的人员。

【讨论】:

感谢您的回答。我试图在我的代码中删除#pragma intrinsic() 和其他一些东西,但我似乎无法让它工作。我想我会尝试用 Ubuntu 安装一个 VirtualBox,并尝试让代码在那里工作...... 我寻找了一些很好的替代 ReadWriteBarrier 编译器内在函数(无论如何现在都已弃用)。对于需要跨线程同步访问的数据,您可能希望切换到使用 。

以上是关于代码可以用 VS 编译,但不能用 MinGW的主要内容,如果未能解决你的问题,请参考以下文章

QT用VS还是MINGW编译好,有啥区别

QT用VS还是MINGW编译好,有啥区别

Qt 如何生成可执行程序,用mingw32-make生成的缺少dll文件

用mingw32 gcc 一编译就出一大堆错误,应该怎么解决

vs 编译库文件 Qt编译库文件

为啥这段代码不能用 VS2010 和 gcc 4.8.1 编译