1

尝试使用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 在这里没有给我很多线索,除了有一个我无法弄清楚的链接问题。

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

4

1 回答 1

1

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

于 2021-01-26T21:38:56.373 回答