使用Windows库和CMake抛出“undefined symbol:__declspec(dllimport)”

yebdmbv4  于 3个月前  发布在  Windows
关注(0)|答案(1)|浏览(100)

我正在将一个现有的应用程序从Linux迁移到Windows。我不是一个非常有经验的Windows开发人员,所以我试图坚持使用已知的工具。我正在使用CLion和CMake来尝试运行这个应用程序。
应用程序调用了一个我不知道的黑盒库,只是一个包含.h、.dll和.lib文件的zip文件。
示例代码结构如下:

test/
├─ sdk/
│  ├─ include/
│  │  ├─ netsdk.h
│  ├─ lib/
│  │  ├─ kdnetsdk.dll
│  │  ├─ kdnetsdk.lib
├─ CMakeLists.txt
├─ main.cpp

字符串
main.cpp尝试调用此库的函数:

#include "netsdk.h"

int main()
{
    int ret = NET_Init();
    return ret;
}


CMakeLists.txt:

cmake_minimum_required(VERSION 3.27)
project(test)

set(CMAKE_CXX_STANDARD 17)

add_executable(test main.cpp)

add_library(sdk SHARED IMPORTED)
set_property(TARGET sdk PROPERTY
        IMPORTED_LOCATION "${PROJECT_SOURCE_DIR}/sdk/lib/kdnetsdk.dll")
set_property(TARGET sdk PROPERTY
        IMPORTED_IMPLIB "${PROJECT_SOURCE_DIR}/sdk/lib/kdnetsdk.lib")
set_property(TARGET sdk PROPERTY
        INTERFACE_INCLUDE_DIRECTORIES $<INSTALL_INTERFACE:sdk/include>)

target_include_directories(test PUBLIC
        "${PROJECT_SOURCE_DIR}/sdk/include"
)

target_link_libraries(test PRIVATE sdk)


编译时,这是错误输出:

[2/2] Linking CXX executable test.exe
FAILED: test.exe 
cmd.exe /C "cd . && "C:\Users\glamd\AppData\Local\Programs\CLion Nova\bin\cmake\win\x64\bin\cmake.exe" -E vs_link_exe --intdir=CMakeFiles\test.dir --rc=C:\PROGRA~2\WI3CF2~1\10\bin\100226~1.0\x64\rc.exe --mt=C:\PROGRA~2\WI3CF2~1\10\bin\100226~1.0\x64\mt.exe --manifests  -- C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\Llvm\x64\bin\lld-link.exe /nologo CMakeFiles\test.dir\main.cpp.obj  /out:test.exe /implib:test.lib /pdb:test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console  D:\test\sdk\lib\kdnetsdk.lib  kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib && cd ."
LINK Pass 1: command "C:\PROGRA~1\MICROS~2\2022\COMMUN~1\VC\Tools\Llvm\x64\bin\lld-link.exe /nologo CMakeFiles\test.dir\main.cpp.obj /out:test.exe /implib:test.lib /pdb:test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console D:\test\sdk\lib\kdnetsdk.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\test.dir/intermediate.manifest CMakeFiles\test.dir/manifest.res" failed (exit code 1) with the following output:
lld-link: error: undefined symbol: __declspec(dllimport) NET_Init
>>> referenced by D:\test\main.cpp:6
>>>               CMakeFiles\test.dir\main.cpp.obj:(main)
ninja: build stopped: subcommand failed.


netsdk. h有数千行,但这些位似乎很重要:

#ifdef __cplusplus
extern "C" {
#endif

...

#ifdef WIN32
    #ifdef _NETSDK_
        #define NVR_API __declspec(dllexport)
    #else
        #define NVR_API __declspec(dllimport)
    #endif
    #define STDCALL _stdcall
#else
    #define NVR_API
    #define STDCALL
#endif

...

NVR_API s32 STDCALL NET_Init();


由于某种原因,Linker似乎找不到该函数,我一直试图配置CLion工具链使用mingw或visual studio,每个链接器都给出了同样的错误。我需要特定的windows配置吗?正如我所说的,在Linux中,我只是将cmake指向.so和.h文件,没有问题。

dxxyhpgq

dxxyhpgq1#

愚蠢的简单解决方案.看起来这个库只支持x86,将CLion工具链配置为x86而不是amd64,它就开始工作了。CmakeLists.txt文件在我的问题帖子之后没有变化,所以它对其他人有帮助。

相关问题