c++ - CMake:在 Windows 中拥有共享库:加载共享库时出错
问题描述
我有一个具有下一个结构的 CMake 项目:
├── CMakeLists.txt
├── app
│ ├── CMakeLists.txt
│ └── main.cpp
│
└── theLib
├── CMakeLists.txt
├── internal
│ ├── internal.cpp
│ └── internal.h
├── myprint.cpp
└── myprint.h
输出树是:
├── app
│ └── app.exe
├── theLib
│ └── libtheLib.dll
如果我在 linux 下编译程序,一切正常,但是当我在 Windows 下编译时,编译正常,但 app.exe 不执行; 我得到下一个错误:
*app.exe: error while loading shared libraries: libtheLib.dll: cannot open shared object file: No such file or directory.*
我怀疑不要链接 internal.cpp,因为当我将其程序内联到 internal.h 时,它可以正常工作。
请问有什么帮助吗?
以下是文件: root::CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(CMAKE_PROJECT_NAME "testProject")
project(${CMAKE_PROJECT_NAME})
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
#set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(BIN_PATH "binAPP")
set(TMP_BUILD "tmpBuild")
set(LIB_PATH "theLib")
set(APP_PATH "app")
set(OUT_PATH ${CMAKE_SOURCE_DIR}/../${BIN_PATH})
set(BUILD_TEMP_PATH ${OUT_PATH}/${TMP_BUILD})
add_subdirectory(${LIB_PATH} ${BUILD_TEMP_PATH}/${LIB_PATH})
include_directories(${LIB_PATH})
add_subdirectory(${APP_PATH} "${BUILD_TEMP_PATH}/${APP_PATH}")
include_directories(${APP_PATH})
应用程序::CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUT_PATH}/${APP_PATH}) #/${APP_PATH}
include_directories(
)
set(SOURCES
main.cpp
)
add_executable(${APP_PATH} ${SOURCES})
add_dependencies(${APP_PATH} ${LIB_PATH})
target_link_libraries(${APP_PATH} PUBLIC ${LIB_PATH} )
theLib::CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUT_PATH}/${LIB_PATH})
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUT_PATH}/${LIB_PATH})
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUT_PATH}/${LIB_PATH})
include_directories(
#./internal
)
add_library(${LIB_PATH} SHARED
myprint.h
myprint.cpp
./internal/internal.h
./internal/internal.cpp
)
set(LINK_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}/internal"
)
target_include_directories(${LIB_PATH} PUBLIC ${LINK_DIRS} )
target_link_libraries(${LIB_PATH} PUBLIC )
提前致谢。
解决方案
您需要确保应用程序可以找到您的 dll。为此,您必须:
- 将exe和dll放在同一个文件夹中
- 将可以找到 dll 的文件夹添加到 PATH 环境变量中。
在这里你可以了解更多关于 dll-loading如何加载 dll
推荐阅读
- c# - 地图属性whith where条件
- winforms - Winform 在提出分层对象时减少/删除视觉伪影
- mysql - 使用 MySQL 的 Rust Actix-Web 示例项目 - Arity > 12 项
- javascript - PNG 和 JPEG 图像在 Next.js 中无法使用 next-optimized-images
- java - whitelabel 错误 - ModelAndView 与 url 中的参数
- flutter - 如何检查 flashing_sound 中的间歇性声音?
- mysql - 数据未通过 laravel 在 mysql 中更新
- c++ - 输出在每个测试用例之后打印,而不是在最后打印
- ads - Google Ads gtag.js 跟踪代码会从我的随机开发 test.html 中收集数据吗?
- apache-spark - spark独立集群:如何限制工人数量?