【问题标题】:Forcing linking by name using CMake使用 CMake 强制按名称链接
【发布时间】:2017-06-19 11:01:29
【问题描述】:

我已经使用 MSBuild 在 Windows 10 64 位上成功编译了 Mongo C++11 驱动程序。尝试运行测试时收到错误消息;

The ordinal 4694 could not be located in the dynamic library libmongoc-1.0.dll

在搜索了如何通过名称强制链接 C++ 库后,我被指向 CMake 的 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 选项。 在 CMakeLists.txt 中设置它以编译 Mongo C 驱动程序后,我仍然收到相同的错误消息 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON) 。我尝试在所有 Mongo 驱动程序(BSON、C 和 C++)中设置它,但仍然收到相同的错误消息。我也在 CMake 命令行 -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=ON 上尝试过,得到了同样的错误信息。

我是出于预期目的使用此选项还是有其他选项可以设置?

【问题讨论】:

  • 我不确定非缓存变量的-D 选项的行为,但set 命令的正确语法是set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)。在任何目标声明之前尝试此语法
  • 你能尝试用 mongoc-1.0.dll 替换 libmongoc-1.0.dll 吗(同样适用于 libbson)?

标签: c++ mongodb c++11 msbuild


【解决方案1】:

CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 定义要导出的什么,而不是如何。而事实上,与序数导出相结合是没有意义的。按序数导出基本上是对导出的函数进行编号。显然,这需要一个稳定的映射,因为进出口方必须达成一致。但是CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 会即时构建导出表,这不会是稳定的。

这里真正的问题是为什么你要导入序数。那是 1990 年代的优化。只需使用名称。

【讨论】:

  • 在编译 Mongo C++ 库时收到此错误The ordinal 4694 could not be located in the dynamic library libmongoc-1.0.dll 后,我尝试使用该 CMake 选项,因此也试图找到避免这种情况的方法。你对我如何避免这种情况有什么建议吗?首先,我没有做任何更改原始源代码的操作。
  • @Amani:你完全没有理解我的意思。问题是使用4694 的EXE。为什么?
  • 我对 C++ 的那个领域没有经验。在编译我的 EXE 时,我没有指定任何要使用的东西 4694。我只是像 cmake -G "Visual Studio 15 2017 Win64" -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=C:/install_mongo ../src 一样调用 CMake。
  • @Amani:好的,最后一次尝试:问题不在于 CMake,问题不在于 MongoDB。问题在于您未命名的其他程序。
  • 请看我的另一个问题here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-22
  • 2016-02-21
相关资源
最近更新 更多