2013-04-22 89 views
0

我想用MinGW编译一个DLL,并使用Visual Studio编译的可执行文件编译它。DLL包括unordered_map不是用visual studio编译器编译

来自DLL的源文件之一是使用hash_map <>,它可以用MinGW成功编译。

当我改变hash_map<>std::tr1::unordered_map<>并添加#include <tr1/unordered_map>我的代码它的成功编译为Visual Studio编译器。(How can I force MinGW to use tr1 namespace?

,但是当我试图编译MinGW的代码作为一个DLL,并从使用可执行文件编译与Visual Studio编译器它给错误:无法打开包含文件'tr/unordered_map'

必须我的DLL兼容CL和MinGW同时?

编辑: 我编译的命令低于:

g++ -shared -o stemming.dll stemming.cpp alphabet.cpp basic.cpp determinise.cpp fst.cpp hopcroft.cpp operators.cpp utf8.cpp -Wl,--output-def,stemming.def,--out-implib,libstemming.a 

lib /machine:i386 /def:stemming.def 

cl sfstMinGW.cpp SFST/stemming.lib 
+1

所有这些容器应该是Dll实现的一部分,而不是接口。在这种情况下,它们的头文件应该仅包含在.cpp文件中,并且不应该影响使用另一个编译器构建的Dll客户端。如果您试图将模板容​​器包括到Dll接口中,即使对于相同的编译器,这也是错误的。 – 2013-04-22 14:31:02

+0

你实际上是想''包括** ** tr **/unordered_map还是在你的问题中有一个错字? – jerry 2013-04-22 19:47:21

回答

0

VC++试图打开一个头文件,并在包括路径不能找到它。 VC使用INCLUDE环境变量来确定搜索头文件时要使用的路径。由于VC不使用tr/目录,因此它不会找到它。您需要为VC和g ++提供包含语句,并选择使用下面的语句。

#if defined(_MSC_VER) 
# include <unordered_map> 
#else 
# include <tr/unordered_map> 
#endif 

您需要确保使用DLL使用的相同实现unordered_map来编译应用程序。这意味着您需要更新包含路径才能使用GCC的TR1版本,而不是MS的标准报头实现。