2016-11-14 6 views
1

次の問題が発生しました。私はスーパーのライブラリと呼ばれるMYLIBを持っている:それは次のようになります。エラーがコンパイルされずにインクルードされたライブラリでファイルが実行されているCake(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; 
    } 

} 


これらは同じディレクトリにあります。

私は、次のCMakeLists.txt

cmake_minimum_required(VERSION 3.6) 
project(library) 

add_library(library SHARED mylib.cpp) 

ビル出力でCMakeのを使用して、それをビルドします。

[ 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がプログラムで使用できないことを示します。

  1. 現在のプロセスの実行ファイルが置か あるディレクトリ:次のように窓には、DLLの検索パスです。
  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を実行ディレクトリにコピーした後、実行するように管理しました。どうもありがとう! –

関連する問題