用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++
不是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编译FCL的主要内容,如果未能解决你的问题,请参考以下文章