用VS编译FCL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用VS编译FCL相关的知识,希望对你有一定的参考价值。

参考技术A FCL是一个在由三角形组成的几何模型上执行三种近似查询的库。

FCL最低要求是VS2015,我这里用的是VS2019。

https://github.com/flexible-collision-library/fcl

http://eigen.tuxfamily.org/index.php?title=Main_Page

https://github.com/danfis/libccd

http://octomap.github.com

选择默认设置即可。

在生成FCL之前需要修改CMakeLists.txt文件,分别把Eigen\libccd\octomap的路径加上:

用CMake进行Generate时会报错,可忽略:

双击打开E:\FCL\project\libccd-master\build里的libccd.sln,所有库的编译都统一用Debug|x64,开始编译:

双击打开E:\FCL\project\octomap-devel\build里的octomap-distribution.sln,开始编译

双击打开E:\FCL\project\fcl-master\build里的fcl.sln,开始编译

选中项目test_fcl_box_box,右键选中设为启动项目:

将ccd.dll从E:\FCL\project\libccd-master\build\src\Debug拷贝到文件夹E:\FCL\project\fcl-master\build\test\Debug,运行程序:

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

【中文标题】代码可以用 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编译FCL的主要内容,如果未能解决你的问题,请参考以下文章

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

麻烦问一下怎么用vs2010编译运行C#,就像eclipse那样。。。

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

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

用vs2015写c++,编译报错项目已过期,怎么回事?

用VS2010编译的C++大作业出现了无法识别的外部符号BUG