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})

app::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} )

Lib::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。要做到这一点,你必须:

  1. 将exe和dlll放在同一文件夹中
  2. 将可以找到dll的文件夹添加到PATH环境变量中

在这里你可以了解更多关于dll加载的信息dll如何加载

最新更新