gpt4 book ai didi

visual-c++ - MSVC 中的链接错误 LNK2019,带有 __imp__ 前缀的未解析符号,但应该来自静态库

转载 作者:行者123 更新时间:2023-12-02 05:17:05 26 4
gpt4 key购买 nike

我在 MSVC 中遇到了我为 g++ 编写的项目的链接问题。问题是这样的:

我将 libssh 构建为静态库,作为我的应用程序的一部分,并在 cmake 中添加目标

add_library(ssh_static STATIC $libssh_SRCS)

Libssh 是用 C 语言编写的,因此我使用“extern "C"{...}”将包含内容包装在我的 C++ 源代码中。然后,我使用

将 ssh_static 目标链接到我的可执行文件 sshconnectiontest

target_link_libraries(sshconnectiontest ... ssh_static ...)

这一切在带有 gcc 的 linux 中工作得很好,但现在在 MSVC 中我得到了

error LNK2019: unresolved external symbol __imp__[function names here] referenced in [filename]

对于我使用的每个 libssh 函数。

有什么想法出了什么问题吗?我在某处读到 imp 前缀意味着链接器期望链接 .dll,但情况不应如此,因为 ssh_static 在 add_library 调用中被声明为静态库...

最佳答案

根据我对 Windows 时代的内存,在 MinGW 构建的 DLL 中,__imp__符号前缀用于调用 DLL 的 Trampoline 函数。然后,该符号由扩展名为 .dll.a 的小型静态库提供。 .

当您包含 libssh header 时,您需要设置 #define表明您希望静态链接。如果不这样做, header 中的 libssh 函数将被声明为 __declspec(dllimport)所以__imp__链接时将出现符号。

我查看了 libssh 源代码,并在 libssh.h 的顶部找到了它:

#ifdef LIBSSH_STATIC
#define LIBSSH_API
#else
#if defined _WIN32 || defined __CYGWIN__
#ifdef LIBSSH_EXPORTS
#ifdef __GNUC__
#define LIBSSH_API __attribute__((dllexport))
#else
#define LIBSSH_API __declspec(dllexport)
#endif
#else
#ifdef __GNUC__
#define LIBSSH_API __attribute__((dllimport))
#else
#define LIBSSH_API __declspec(dllimport)
#endif
#endif
#else
#if __GNUC__ >= 4
#define LIBSSH_API __attribute__((visibility("default")))
#else
#define LIBSSH_API
#endif
#endif
#endif

您需要定义LIBSSH_STATIC ,或者通过 #define之前#include <libssh.h>线,或作为 /D选项。由于您使用的是 CMake,因此您可能会通过 add_definitions 来执行此操作在CMakeLists.txt .

关于visual-c++ - MSVC 中的链接错误 LNK2019,带有 __imp__ 前缀的未解析符号,但应该来自静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3704374/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com