2016-11-14 87 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複製到執行目錄後設法讓它運行。非常感謝! –