【问题标题】:CMake: Own Shared libray in Windows: error while loading shared librariesMake:在 Windows 中拥有共享库:加载共享库时出错
【发布时间】:2021-03-12 15:00:19
【问题描述】:

我有一个具有下一个结构的 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} )

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 )

提前致谢。

【问题讨论】:

  • exe和dll在同一个输出文件夹吗?
  • 谢谢。不,如果是,则执行,但我尝试将它们放在单独的文件夹中

标签: c++ windows cmake shared


【解决方案1】:

您需要确保应用程序可以找到您的 dll。为此,您必须:

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

在这里您可以了解更多关于 dll 加载的信息How dll get loaded

【讨论】:

  • 谢谢,我最好不要使用 PATH 环境变量。 windows下可以吗? Linux下没有问题
  • 好的,我刚看了,在windows下是不可能的,那我可以用cmake修改windows路径变量吗??..我想是的,我会试试的,非常感谢
猜你喜欢
  • 2011-05-29
  • 2017-11-05
  • 2014-12-09
  • 2022-01-04
  • 2016-10-26
相关资源
最近更新 更多