2016-11-14 85 views
1

我有以下问题;我有我的超级图书馆称为MYLIB:它看起来像这样:C++运行文件与包含库failes没有编译错误(CMake/CLion)

我的项目文件夹名为库...


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

} 


它们在同一个目录中。

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

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) 

当我评论的方法叫唤,它就像一个魅力。

我一直在这里呆了几个小时,有什么帮助吗?

+4

好像你正在做的大部分都很好。也许一个基本的检查:是否可以在你正在执行你的应用程序的任何工作目录中使用dll? (或通过PATH) – hauron

+0

@hauron在将.dll复制到执行目录后,我设法让它运行。非常感谢! –

回答

2

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 
+0

我在将.dll复制到执行目录后设法让它运行。非常感谢! –