我正在使用C ++ CLI在Visual Studio 2012中编写Windows窗体GUI应用程序,我真的需要使用Boost双向映射来协调某些GUI元素值与某些内部结构中的值。我下载并解压缩了boost包,然后在我的项目的Properties菜单中,我将Boost位置添加到Configuration Properties - > VC ++目录 - >包括目录。
但是,当我添加boost include时(没有别的,甚至没有声明一个boost :: bimap对象)
#include <boost/bimap.hpp>
我收到了错误
error C3389: __declspec(dllexport) cannot be used with /clr:pure or /clr:safe
error C3395: 'boost::serialization::void_cast_register' : __declspec(dllexport) cannot be applied to a function with the __clrcall calling convention
当我遵循编译错误时,我最终进入&#34; void_cast_fwd.hpp&#34;并在下面包含&#34; BOOST_DLLEXPORT&#34;但我不知道该怎么做。
#ifndef BOOST_SERIALIZATION_VOID_CAST_FWD_HPP
#define BOOST_SERIALIZATION_VOID_CAST_FWD_HPP
// MS compatible compilers support #pragma once
#if defined(_MSC_VER)
# pragma once
#endif
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
// void_cast_fwd.hpp: interface for run-time casting of void pointers.
// (C) Copyright 2005 Robert Ramey - http://www.rrsd.com .
// Use, modification and distribution is subject to the Boost Software
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
// gennadiy.rozental@tfn.com
// See http://www.boost.org for updates, documentation, and revision history.
#include <cstddef> // NULL
#include <boost/serialization/force_include.hpp>
namespace boost {
namespace serialization {
namespace void_cast_detail{
class void_caster;
} // namespace void_cast_detail
template<class Derived, class Base>
BOOST_DLLEXPORT
inline const void_cast_detail::void_caster & void_cast_register(
const Derived * dnull = NULL,
const Base * bnull = NULL
) BOOST_USED;
} // namespace serialization
} // namespace boost
#endif // BOOST_SERIALIZATION_VOID_CAST_HPP
我是.NET和C ++ CLI的新手,不知道如何更改编译器命令/ clr:pure或/ clr:safe。
关于如何在我的应用程序中使用此boost库的任何想法都将非常感激。
另外,我现在不担心可移植性,我关心的是它在Windows上编译。我假设我在.NET中使用C ++ CLI比尝试使用boost库更具有可移植性限制,但我也有兴趣听到有关这方面的意见。
谢谢!
答案 0 :(得分:4)
C ++ / CLI编译器通常可以确定代码是本机代码还是托管代码。但并非总是如此,而且这有助于产生您看到的错误。您需要帮助并明确说明哪些声明是原生的。
首先确保正确设置了/ clr选项,对于您尝试使用的增强代码没有任何安全或纯粹。项目+属性,常规,公共语言运行时支持设置。确保它是普通的/ clr。
然后告诉编译器boost头包含带有#pragma:
的本机代码#pragma managed(push, off)
#include #include <boost/bimap.hpp>
#pragma managed(pop)
应该处理编译错误。
答案 1 :(得分:0)
编译器消息很明确:您无法从CLR(或混合模式)程序集导出本机DLL条目。
因此,指定__delcspec(dllexport)
的代码是非法的。
Boost序列化 - 可能 - 有助于添加这些可导出的内容,以便您可以在一个DLL中定义可序列化的类,并从另一个模块中反序列化它们(基于运行时类型信息)。
然而,这不是您目前所需要的。
您需要在代码中找到具有违规声明说明符的位置,并确保它不再是顽皮的。
我非常有信心这个特定的声明规范不是硬编码的,但很可能由像
这样的开关控制#define BOOST_SERIALIZATION_WHELPS_IM_NOT_INTERESTED_IN_WIN32_DLL_STUFF_HERE