【问题标题】:C++ - Unable to link in libyaml using Visual Studio 2019/CMakeC++ - 无法使用 Visual Studio 2019/CMake 链接 libyaml
【发布时间】:2021-01-22 22:33:54
【问题描述】:

尝试使用 Visual Studio 2019 Enterprise 和 CMake 链接 libyaml (0.2.5),因为我有一个跨平台 (Linux/Windows) 项目使用这个图书馆。根据文档,这个库应该可以在 Windows 10 上运行。它在 Linux(64 位机器)上链接得很好。

我将它编译为静态库,生成 .lib 文件没有问题。我已将它复制到我从 CMakelists.txt 以及标题中链接的适当位置。

当我从我在 Windows 上的项目中链接它时:

ts.lib(yamlparser.cxx.obj) : error LNK2019: unresolved external symbol __imp_yaml_parser_initialize referenced in function "public: bool __cdecl YAMLParser::parse_cfg(void)" (?parse_cfg@YAMLParser@@QEAA_NXZ)
ts.lib(yamlparser.cxx.obj) : error LNK2019: unresolved external symbol __imp_yaml_parser_set_input_file referenced in function "public: bool __cdecl YAMLParser::parse_cfg(void)" (?parse_cfg@YAMLParser@@QEAA_NXZ)
ts.lib(yamlparser.cxx.obj) : error LNK2019: unresolved external symbol __imp_yaml_parser_scan referenced in function "public: bool __cdecl YAMLParser::parse_cfg(void)" (?parse_cfg@YAMLParser@@QEAA_NXZ)

这就是我在 CMake 方面所做的事情 - 与我在 Linux 和 Windows 上链接我的 GoogleTest 库所做的事情完全相同:

if (UNIX)
...
...
else()
  set (MY_LIB_DIR "C:/mylib/lib")
  set (MY_INCLUDE "C:/mylib/include")

  set (YAML_LIB "${MY_LIB_DIR}/yaml.lib")
  set (VCPKG_LIBRARY_LINKAGE static) 
endif()

include_directories(${MY_INCLUDE})

add_library(ts
    ...
    ...
)

add_executable(myexec main.cxx)
target_link_libraries(myexec ts ${YAML_LIB})

VS 在这里并没有给我很多线索,只是有一个我无法弄清楚的链接问题。

关于如何调试此问题或问题可能是什么的任何建议?

【问题讨论】:

  • 您的yaml.lib 似乎包含用于 YAML 的 C++ 库,但该库依赖于 C 库。因此,您还需要将可执行文件与 YAML 的 C 库链接。 (您知道 static 库不携带依赖项,不是吗?)。
  • libyaml 看起来是一个没有 C++ 组件的 C 库。我在 Linux 问题上仅链接单个静态库文件,并且可以毫无问题地链接和运行。
  • 嗯,实际上是 ts 库需要符号 libyaml(这就是错误消息包含 ts.lib(yamlparser.cxx.obj) 的原因)。而且您的 libyaml 似乎不包含该符号。你如何构建libyaml?您是否为此使用了 Visual Studio 2019 Enterprise?
  • 是的,ts 是我创建的一个库,可以轻松容纳我的 CMake 目录结构(当您有单独的 src/ 和 tests/ 目录时会有所帮助)。我确实使用 Visual Studio 2019 Enterprise 使用默认设置 + 从我的 CMakelist 文件生成的内容构建了 libyaml。
  • 嗯,那么什么时候你得到了错误?您在构建ts 库或构建myexec 可执行文件时是否遇到此错误?

标签: c++ cmake yaml visual-studio-2019 libyaml


【解决方案1】:

__imp 是我的代码试图动态包含库的线索...打开 yaml.h,我注意到它试图从 DLL 导出,除非 YAML_DECLARE_STATIC 已定义。在 CMake 中定义了这个,我的问题就解决了。

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    相关资源
    最近更新 更多