当前位置: 首页 > 知识库问答 >
问题:

CMake:在Windows中拥有共享库:加载共享库时出错

益源
2023-03-14

我有一个CMACE项目,它的下一个结构是:

├── 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 )

提前道谢。

共有1个答案

燕雨石
2023-03-14

您需要确保应用程序能够找到您的DLL。要做到这一点,您必须:

  1. 将exe和dlll放入同一文件夹
  2. 将dll所在的文件夹添加到您的PATH-environment变量中。

在这里,您可以了解有关dll加载的更多信息dll是如何加载的

 类似资料:
  • 问题内容: 我正在做centos。我在系统上安装了1.45.0 Boost版本。程序已正确编译,但是每当我键入命令以查看输出时,就会出现以下错误: ./a.out:加载共享库时出错:libboost_thread.so.1.45.0:无法打开共享库文件:没有此类文件或目录 问题答案: 您是如何安装Boost库的? 您可能遇到的问题是链接器找不到库,并且在构建程序时,必须手动指定其他库路径来搜索库。

  • 问题内容: 我正在从python脚本中调用一个so文件。据我了解,我真的不需要释放使用ctypes在python中打开的共享库。但是,在我的so文件代码中,它dlopen另一个so文件并且不执行dlclose()。在这种情况下,从python端使用安全吗?我不必释放在ctypes内部加载的共享库soe文件吗? 问题答案: 始终遵循 “自己清洁后清理 ”的规则(尽管现代技术会为您提供清洁方面的帮助)

  • 我正在尝试链接一个名为libtest lib的预编译共享库文件。所以这是我在CMakeLists的底部所拥有的。txt: 如上所述,我得到以下错误: 如果我注释掉add_library行,我会得到以下结果: 在库中链接时,似乎绝对需要源文件(.c、cpp等)。但我如何在一个。那档案呢?这些文档对target_link_库()做了如下介绍: 被命名的必须是由add_executable()或add_

  • 库用于将相似函数打包在一个单元中。然后这些单元就可为其他开发人员所共享,并因此有了模块化编程这种说法— 即,从模块中构建程序。Linux支持两种类型的库,每一种库都有各自的优缺点。静态库包含在编译时静态绑定到一个程序的函数。动态库则不同,它是在加载应用程序时被加载的,而且它与应用程序是在运行时绑定的。 使用共享库的方法有两种:您既可以在运行时动态链接库,也可以动态加载库并在程序控制之下使用它们。本

  • 如果你想添加共享库支持到一个原来不包含共享库支持的 port 或是其它软件, 共享库的版本号应该遵循如下规则。通常来说,由此得出的数字与软件的发行版本无关。 建立共享库的三个原则是: 从1.0开始 如果改动与以前版本相兼容,增加副版本号(注意,ELF系统忽略副版本号)。 如果是个不兼容的改动,增加主版本号。 例如,添加函数和修正错误导致副版本号增加, 而删除函数、函数调用语法改变等,会迫使主版本号

  • 4. 共享库 4.1. 编译、链接、运行 组成共享库的目标文件和一般的目标文件有所不同,在编译时要加-fPIC选项,例如: $ gcc -c -fPIC stack/stack.c stack/push.c stack/pop.c stack/is_empty.c -f后面跟一些编译选项,PIC是其中一种,表示生成位置无关代码(Position Independent Code)。那么用-fPIC