代码可以用 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++
不是C
。 C
没有课程,所以请正确标记您的问题。
您不能使用在 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 如何生成可执行程序,用mingw32-make生成的缺少dll文件