C++ - 无法使用 Visual Studio 2019/CMake 在 libyaml 中 link
C++ - Unable to link in libyaml using Visual Studio 2019/CMake
尝试使用 Visual Studio 2019 Enterprise 和 CMake 在 libyaml (0.2.5) 中 link,因为我有一个使用这个库的 cross-platform (Linux/Windows) 项目。根据文档,这个库应该在 Windows 10 中工作。它 link 在 Linux(64 位机器)上很好。
我将其编译为静态库,生成 .lib 文件没有问题。我已将它复制到我 link 从我的 CMakelists.txt 以及 header.[= 进入的适当位置14=]
当我 link 它来自我在 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 库中对 link 所做的完全相同:
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 在这里没有给我很多线索,只是有一个 linkage 问题我不太明白。
关于如何调试这个问题或可能是什么问题的任何建议?
__imp 是我的代码试图动态包含库的线索...打开 yaml.h,我注意到它尝试从 DLL 导出,除非定义了 YAML_DECLARE_STATIC。在 CMake 中定义了这个,我的问题就解决了。
尝试使用 Visual Studio 2019 Enterprise 和 CMake 在 libyaml (0.2.5) 中 link,因为我有一个使用这个库的 cross-platform (Linux/Windows) 项目。根据文档,这个库应该在 Windows 10 中工作。它 link 在 Linux(64 位机器)上很好。
我将其编译为静态库,生成 .lib 文件没有问题。我已将它复制到我 link 从我的 CMakelists.txt 以及 header.[= 进入的适当位置14=]
当我 link 它来自我在 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 库中对 link 所做的完全相同:
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 在这里没有给我很多线索,只是有一个 linkage 问题我不太明白。
关于如何调试这个问题或可能是什么问题的任何建议?
__imp 是我的代码试图动态包含库的线索...打开 yaml.h,我注意到它尝试从 DLL 导出,除非定义了 YAML_DECLARE_STATIC。在 CMake 中定义了这个,我的问题就解决了。