考虑这个小图书馆:
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
也是不可能的