MSVC Linkage error while building used unimplemented functions

问题描述 投票:0回答:0

考虑这个小图书馆:
lib.hh:

#ifdef BUILDING
  #ifdef WIN32
    #define EXPORT_THIS __declspec(dllexport)
  #elif defined(__linux__)
    #define EXPORT_THIS extern "C"
  #endif
#else
  #ifdef WIN32
    #define EXPORT_THIS __declspec(dllimport)
  #elif defined(__linux__)
    #define EXPORT_THIS extern "C"
  #endif
#endif

EXPORT_THIS void Function();
void UseThatFunction();

lib.cc:

#include "lib.hh"

void UseThatFunction() { Function(); }

构建:

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS on)
add_library(ThatLibrary SHARED lib.cc lib.hh)
target_compile_definitions(ThatLibrary PRIVATE BUILDING)

add_subdirectory(backend)

这样使用:
使用.cc

#include "../lib.hh"
void EXPORT_THIS Function() { /* implementation */ }

构建:

add_library(UsingThatLibrary SHARED using.cc)
target_link_libraries(UsingThatLibrary PUBLIC
  ThatLibrary
)

这适用于 GCC,但不适用于 MSVC:

lib.obj : error LNK2019: unresolved external symbol "void __cdecl Function(void)" (?Function@@YAXXZ) referenced in function "void __cdecl UseThatFunction(void)" (?UseThatFunction@@YAXXZ)

我该如何解决?

编辑:构建

lib
静态工作正常。但是共享版本有什么问题?


限制:

  • 我不能有虚函数。
  • 在用户端实现
    UseThatFunction
    也是不可能的
  • 它应该同时使用 GCC(>=11) 和 MSVC(>=2020) 构建。
c++ gcc visual-c++ linker shared-libraries
© www.soinside.com 2019 - 2024. All rights reserved.