【问题标题】:C++ running file with included library failes without compiling error (CMake / CLion)包含库的 C++ 运行文件失败,但没有编译错误(CMake / CLion)
【发布时间】:2017-03-28 10:07:19
【问题描述】:

我遇到了以下问题;我有一个名为 mylib 的超级库:它看起来像这样:

我的项目文件夹被称为库...


mylib.hpp
namespace XYZ {

#ifndef LIBRARY_MYLIB_HPP
#define LIBRARY_MYLIB_HPP

    int add(int, int);

#endif //LIBRARY_MYLIB_HPP

}

mylib.cpp

#include "mylib.hpp"

namespace XYZ {

    int add(int a, int b) {
        return a + b;
    }

}


它们在同一个目录中。

我使用带有以下 CMakeLists.txt 的 CMake 构建它

cmake_minimum_required(VERSION 3.6)
project(library)

add_library(library SHARED mylib.cpp)

建筑输出:

[ 50%] Building CXX object CMakeFiles/library.dir/mylib.cpp.obj
[100%] Linking CXX shared library liblibrary.dll
[100%] Built target library

这行得通,这给了我一个应有的 *.dll 文件。


我现在尝试在我的其他项目中使用这个库

我将 .hpp 文件复制到项目位置。 我的 main.cpp 看起来像这样:


main.cpp

#include <iostream>
#include "mylib.hpp"

int main() {
    std::cout << "Hello";
    std::cout << XYZ::add(5, 7) << std::endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.6)
project(uselib)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(SOURCE_FILES main.cpp)
add_executable(uselib ${SOURCE_FILES})
target_link_libraries(uselib C:/User/........./liblibrary.dll)

建筑输出:

[ 50%] Building CXX object CMakeFiles/uselib.dir/main.cpp.obj
[100%] Linking CXX executable uselib.exe
[100%] Built target uselib


作品。那么现在我的问题。

一旦我尝试启动它,它就会崩溃并出现以下退出代码:

C:\Users\......\uselib.exe

Process finished with exit code -1073741515 (0xC0000135)

当我评论方法调用时,它就像一个魅力。

我被困在这里好几个小时了,有什么帮助吗?

【问题讨论】:

  • 看起来你大部分都做得很好。也许是一个基本的检查:无论您从哪个工作目录执行您的应用程序,该 dll 是否可用? (或通过 PATH)
  • @hauron 在将 .dll 复制到执行目录后,我设法让它运行。非常感谢!

标签: c++ cmake clion


【解决方案1】:

Exit code -1073741515 (0xC0000135) 是 STATUS_DLL_NOT_FOUND。这表明该 dll 在运行时对程序不可用。在windows中,dll的搜索路径如下:

  1. 当前进程的可执行文件所在的目录 位于。
  2. 当前目录。
  3. Windows 系统目录。 GetSystemDirectory 函数 检索此目录的路径。
  4. Windows 目录。 GetWindowsDirectory 函数检索 此目录的路径。
  5. PATH 环境变量中列出的目录。

验证 liblibrary.dll 是否位于可执行文件可以找到的位置。

完成此操作后,您可能需要添加一个宏来帮助您将 dll 作为构建的一部分复制到可执行目录。这可以像这样在 cmake 中完成:

add_custom_command(TARGET uselib POST_BUILD        # Adds a post-build event to uselib
COMMAND ${CMAKE_COMMAND} -E copy_if_different  # which executes "cmake - E copy_if_different..."
    "${PROJECT_SOURCE_DIR}/libs/liblibrary.dll"      # this is in-file
    $<TARGET_FILE_DIR:uselib>)                 # this is out-file path

【讨论】:

  • 在将 .dll 复制到执行目录后,我设法让它运行。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-01
  • 2017-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多