如何确定链接到Boost'的静态库的位置;在构建Field3D时假定了s线程组件?

如何确定链接到Boost'的静态库的位置;在构建Field3D时假定了s线程组件?,boost,build,cmake,static-libraries,static-linking,Boost,Build,Cmake,Static Libraries,Static Linking,我正在构建Field3D,它链接到Boost的线程库。建筑环境如下所示: Windows 10版本1803 64位 Visual Studio 2015更新3 CMake 3.11.4 在VS中释放x64 DLL模式 Field3D源程序包从 Boost是VS2015(v14.0)64位版本1.67.0的预编译二进制文件,从C:\local\Boost\u 1\u 67\u 0目录下载并安装 Doxygen和HDF5安装正确 用于设置VS2015的CMake命令行是: cmake-DCMAK

我正在构建
Field3D
,它链接到
Boost
的线程库。建筑环境如下所示:

  • Windows 10版本1803 64位
  • Visual Studio 2015更新3
  • CMake 3.11.4
  • 在VS中释放x64 DLL模式
  • Field3D源程序包从
  • Boost是VS2015(v14.0)64位版本1.67.0的预编译二进制文件,从C:\local\Boost\u 1\u 67\u 0目录下载并安装
  • Doxygen和HDF5安装正确
用于设置VS2015的CMake命令行是:

cmake-DCMAKE\u CONFIGURATION\u TYPES=Release-DBUILD\u SHARED\u LIBS=ON -DCMAKE\u INSTALL\u PREFIX=C:…\Field3D master\INSTALL-DDOXYGEN\u EXECUTABLE=“C:\Program Files\doxygen\bin\doxygen.exe”-DHDF5\u ROOT=“C:\Program Files\HDF\u Group\HDF5\1.10.2”-DBOOST\u ROOT=C:\local\boost\u 1\u 67\u 0-DBOOST\u INCLUDEDIR=C:\local\boost\u 1\u 67\u 0\boost-DBOOST\u LIBRARYDIR=C:\local\boost\u 1\u 67\u 0\lib64-msvc-14.0-DIlmbase\u-Dir=C:…\openexr develop\IlmBase\install\G“Visual Studio 14 2015 Win64”

然后我在VS2015中打开生成的
field3d.sln
,并尝试构建
field3d
项目。错误报告如下:

1>------ Build started: Project: Field3D, Configuration: Release x64 ------
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "public: virtual __cdecl boost::detail::thread_data_base::~thread_data_base(void)" (??1thread_data_base@detail@boost@@UEAA@XZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "public: void __cdecl boost::thread::detach(void)" (?detach@thread@boost@@QEAAXXZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "class boost::thread::id __cdecl boost::this_thread::get_id(void)" (?get_id@this_thread@boost@@YA?AVid@thread@2@XZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "public: class boost::thread::id __cdecl boost::thread::get_id(void)const " (?get_id@thread@boost@@QEBA?AVid@12@XZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "bool __cdecl boost::this_thread::interruptible_wait(void *,struct boost::detail::mono_platform_timepoint const &)" (?interruptible_wait@this_thread@boost@@YA_NPEAXAEBUmono_platform_timepoint@detail@2@@Z) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "private: bool __cdecl boost::thread::join_noexcept(void)" (?join_noexcept@thread@boost@@AEAA_NXZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "public: bool __cdecl boost::thread::joinable(void)const " (?joinable@thread@boost@@QEBA_NXZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>libboost_thread-vc140-mt-x64-1_67.lib(thread.obj) : error LNK2005: "private: bool __cdecl boost::thread::start_thread_noexcept(void)" (?start_thread_noexcept@thread@boost@@AEAA_NXZ) already defined in boost_thread-vc140-mt-x64-1_67.lib(boost_thread-vc140-mt-x64-1_67.dll)
1>     Creating library C:/.../Field3D-master/build/Release/Field3D.lib and object C:/.../Field3D-master/build/Release/Field3D.exp
1>C:\...\3rd-parties\Field3D-master\build\Release\Field3D.dll : fatal error LNK1169: one or more multiply defined symbols found
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========
据我所知,这些错误的原因是Field3D的
CMakeLists.txt

FIND_PACKAGE (Boost COMPONENTS regex thread)
指定链接boost的线程组件,从而链接导入库
C:\local\boost\u 1\u 67\u 0\lib64-msvc-14.0\boost\u thread-vc140-mt-x64-1\u 67.lib
,正如在VS中的Project Properties->Linker->Input->Additional Dependencies中可以检查到的那样,Field3D以某种方式坚持额外链接到Boost线程组件的静态库,即
libboost\u thread-vc140-mt-x64-1\u 67.lib
(您可以在错误消息中看到),从而导致名称冲突。如果我临时从FIND_包的组件列表中删除“thread”,让Field3D按照它坚持的那样链接到静态库,那么Field3D项目可以正确构建


因为我想基于Boost库的动态DLL构建Field3D,我的问题是:为什么Field3D坚持链接到静态Boost库“libboost_thread-vc140-mt-x64-1_67.lib”?这条规则是在哪里引入的?如何抑制Boost的链接静态线程库?我已经检查了CMakeLists.txt和变量,如
Boost\u LIBRARY\u DIRS
Boost\u LIBRARIES
Field3D\u BIN\u LIBRARIES
,但它们不包含静态库文件名
libboost\u thread-vc140-mt-x64-1\u 67.lib
。我知道,
#pragma comment(linker,…)
也可能需要链接到某个用户定义的库,但Field3D源代码包中没有这样的指令。因此,我束手无策,将这个问题发布在这里,希望有人能帮助我找出Boost线程组件静态库的链接假设到底来自哪里。可能需要一些小的修改来重现这个问题,但我认为上面提供的信息应该涵盖退伍军人的大部分构建。如果您需要任何其他信息来解决此问题,请让我知道。谢谢。

又花了几个小时检查了Field3D的构建过程,我认为问题在于Field3D未能利用Boost的机制禁用自动链接并在Windows上启用动态链接。已提交问题单,希望Field3D的开发人员能够在将来解决它:。简单地说,添加以下两个命令以复制
Boost::disable\u autolinking
Boost::dynamic\u linking
INTERFACE\u COMPILE\u DEFINITIONS
属性,将目标导入Field3D project

TARGET_COMPILE_DEFINITIONS( Field3D PRIVATE $<TARGET_PROPERTY:Boost::disable_autolinking,INTERFACE_COMPILE_DEFINITIONS> )
TARGET_COMPILE_DEFINITIONS( Field3D PRIVATE $<TARGET_PROPERTY:Boost::dynamic_linking,INTERFACE_COMPILE_DEFINITIONS> )
TARGET\u COMPILE\u定义(Field3D PRIVATE$)
目标\u编译\u定义(Field3D PRIVATE$)
在CMakeLists.txt的第189行之后


如果我犯了什么错误,请指出。

你读过吗?@arrowd:是的,我读过。那又怎么样?Field3D source中没有Boost\u USE\u STATIC\u LIBS。我再次阅读了该文档。我想你们认为我错过了这个“在这种情况下,将Boost\u USE\u STATIC\u LIBS设置为OFF可能无法实现动态链接。”但我不认为这句话有助于解决我的问题,因为“may”或“may not”都成立,对吗?如果“may”成立,那就是我想要的——实现了动态链接,应该没有错误。若“may not”保持不变,则不会实现动态链接,这意味着VS不应尝试链接动态库,而只应尝试通过静态库链接boost的线程组件。这样就不会有错误了。。。。。。这实际上是我在帖子中提到的解决方法。促使我提出这个问题的原因如下:VisualStudio与Boost或CMake无关,对吗?所以它不应该隐藏Boost或CMake秘密指定的任何内容,对吗?因此,如果VS(或Field3D)想要链接静态库文件
libboost\u thread….lib
,它应该出现在VS(项目属性->链接器->输入->附加依赖项)的输入库列表中的某个位置,您同意吗?但我没看到。只有导入lib
boost\u线程…lib
存在。这正是我问这个问题的原因。是否尝试使用导入的目标或
Boost::disable_autolinking