我正在尝试使用 MinGW 编译 DLL,并从使用 Visual Studio 编译器编译的可执行文件中使用它。
DLL 中的源文件之一使用了 hash_map<>,并且可以使用 MinGW 成功编译。
当我将
hash_map<>
更改为 std::tr1::unordered_map<>
并将 #include <tr1/unordered_map>
添加到我的代码中时,它可以为 Visual Studio 编译器成功编译。(如何强制 MinGW 使用 tr1 命名空间?)
但是当我尝试使用 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
VC++ 正在尝试打开头文件,但在包含路径中找不到它。 VC 使用
INCLUDE
环境变量来确定搜索头文件时使用的路径。由于 VC 不使用 tr/
目录,因此不会找到它。您需要为 VC 和 g++ 提供 include 语句,并选择使用哪一个,如下所示。
#if defined(_MSC_VER)
# include <unordered_map>
#else
# include <tr/unordered_map>
#endif
您需要确保使用 DLL 所用的
unordered_map
相同的实现来编译应用程序。这意味着您需要更新包含路径以使用 GCC 版本的 TR1,而不是 MS 的标准标头实现。