编译后 CMake 共享 dll 不工作

CMake shared dll not working after compiling

我最近刚刚从 Visual Studio 切换到 CLion,因为我发现它更容易工作。我最大的问题是我对 CMake 的工作原理以及为什么一个非常简单的项目不工作一无所知'不适合我。

我有一个非常小的项目,它为 windows 创建一个 .dll 文件 - 它只有几行加上 link 到我机器上某个地方的 API 库.这是 CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.17)
project(pushpull)

set(CMAKE_CXX_STANDARD 14)

set(API_SRC_Files  "D:/Work/API_SRC_Files")
include_directories(
        .
        ${API_SRC_Files}
        ${API_SRC_Files}/Core

)

add_library(pushpull SHARED CPushPull.cpp CPushPull.h PushPull.cpp)

没有警告或错误,编译似乎成功:

[100%] Linking CXX shared library pushpull.dll
   Creating library pushpull.lib and object pushpull.exp
   Creating library pushpull.lib and object pushpull.exp
[100%] Built target pushpull

Build finished

但是,当我加载 .dll 时,它无法正常工作,我从程序中收到针对此 .dll 的“无法加载”类型的警告。

我正在使用 windows 和 Visual studio 作为工具链。

我怀疑与编译器标志有关,因为我知道在 linux 上使用 gcc 我需要添加 -fPIC 所以我尝试添加这个:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

但这没有任何区别。

我也试过:

if(MSVC)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
    set(BUILD_SHARED_LIBS TRUE)
endif()

再一次,虽然一切都很好地编译,但仍然无法加载。

我知道我一定错过了一些东西,很可能是在 CMakeLists 文件而不是项目设置中,因为如果我只是打开 Visual Studio 在那里创建一个空的 dll 项目并添加这些文件一切正常。

感谢帮助。

更新

如评论中所述,错误消息含糊不清 - 确实如此,但仅此而已,没有注意到其他内容。它希望始终能够加载 dll,所以当它不加载时,它只是说“无法加载 %NAME%”。

如下所述,我可能没有正确地 linking VS 自动执行的库,因此我尝试 linking 使用 VS 项目模板中提到的所有库:

target_link_libraries(pushpull kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib)

但这也行不通。值得注意的是,CMake dll 只有 71kb,而 VS 是 73kb。遗漏了什么?

cmake 中制作 DLL 类似于创建可执行文件! 您必须通过 SHARED 标志和代码文件列表来调用 add_library!正如你所做的那样!

接下来您必须在 add_library 命令后调用 target_link_libraries 并将库引入 link!我在你的 post!

中没有看到 target_link_libraries

如果你两者都做,仔细检查日志,你会发现问题。