DSS*_*DSS 1 c++ native c++-cli word-wrap
我正在尝试将 C++ 库包装到托管项目可以使用它。我使用的第三方库是共享库。它的目的是在加载时链接。我有头文件、.lib 文件(DLL 导入库)和 .DLL 文件。
这是我到目前为止所做的:- 1. 创建 CLR 项目。2. 在C/C++->常规->附加包含目录中添加头文件路径。 3. 在链接器->常规中设置“附加库目录”。4.在Linker->Input->Additional Dependency中添加lib名称
执行此操作后,我收到 LNK2005 链接错误,然后收到 LNK1169。创建项目后我做的唯一一件事就是包含我试图包装的 C++ 库中的头文件。我究竟做错了什么?
错误 LNK2005:“public:virtual char const * __cdecl std::exception::what(void)const ” (?what@exception@std@@UEBAPEBDXZ) 已在...中定义 致命错误 LNK1169:一个或多个多重定义的符号成立
事实上,我们是图书馆的创建者,经过长期的斗争,我们终于解决了这个问题。如果它对其他人有用,这里就是答案。
该库是使用 CMake 生成的,为了避免必须手动导出符号(使用__declspec(export),我们只需打开
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)
但是,在 DLL 中执行此操作意味着 Visual Studio 不仅导出 DLL 本身中定义的符号,而且还导出其继承的依赖项(例如整个 STL)中定义的符号。
前面的(我不太确定为什么)不是问题,您正在链接这个库作为构建可执行文件的一部分(因为我们确实有一个成功使用这个 DLL 的 C++ EXE),但是如果您正在将该 DLL 链接到另一个 DLL(对于 CLI/C++ 就是这种情况,您基本上是在创建一个 DLL 来包装另一个 DLL)。在后者中,CLI DLL也会尝试从系统导入符号,导致之前显示的重新定义:
error LNK2005: "public: virtual char const * __cdecl std::exception::what(void)const " (?what@exception@std@@UEBAPEBDXZ) already defined in ... fatal error LNK1169: one or more multiply defined symbols found
检查这一点的一种方法是查看由基本 C++ DLL(不是 CLI 的)生成的导出文件 (.def),它包含std::exception::what(以及许多其他文件),尽管该 DLL 从未自行定义它。
所以解决方案相当简单:
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS。__declspec(export|import).