如何让 CMake 查看和使用我需要的单个 DLL link & 运行 最简单的程序?

How to I get CMake to see & use a single DLL that I need to link & run the simplest program?

我有一个简单的程序和一个 DLL thirdparty.dll 我必须 link 在编译和 运行 时反对。我把它放在我的 CLion 项目的 lib/ 目录中。无论我做什么,在阅读 CMake 和 SO 帖子数小时后,不,days,我尝试了很多组合,但我可以不要让 CMake 的 find_librarylib/ 目录中直接找到位于 那里 的库。我使用了显式路径、相对路径、完整文件名、不带 .dll 的文件名,随便你怎么说,我总是得到相同的无用消息:

make[2]: *** No rule to make target 'OTHERDLL-NOTFOUND', needed by 'MyProgram.exe'.  Stop.
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/MyProgram.dir/all' failed

这是 CMakeLists.txt 的相关当前摘录:

find_library(OTHERDLL NAMES thirdparty PATHS ${CMAKE_SOURCE_DIR}/lib)
add_library(OTHERDLL SHARED IMPORTED)

include_directories(include)
file(GLOB SOURCES "src/*.c")

add_executable(MyProgram ${SOURCES} src/myprogram.c)
target_link_libraries(MyProgram OTHERDLL)

在 CMake 中,您应该使用 ${...} 来调用变量,而不是

target_link_libraries(MyProgram OTHERDLL)

使用

target_link_libraries(MyProgram ${OTHERDLL})

根据 this tutorial,在组合 find_libraryadd_library 时,您应该在 add_library 调用中使用库名称(而不是完整路径),然后设置导入位置。所以:

find_library(OTHERDLL NAMES thirdparty PATHS ${CMAKE_SOURCE_DIR}/lib)
message(STATUS "find_library returned ${OTHERDLL}")
add_library(anyNameIsGood SHARED IMPORTED) #anyNameIsGood could be thirdparty for example
set_property(TARGET anyNameIsGood PROPERTY IMPORTED_LOCATION "${OTHERDLL}")
#(...)
target_link_libraries(MyProgram anyNameIsGood)