编译后 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
如果你两者都做,仔细检查日志,你会发现问题。
我最近刚刚从 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
如果你两者都做,仔细检查日志,你会发现问题。