2016-11-22 4 views
1

私はQtベースの私のプロジェクトを生成するには、次のCMakeLists.txtファイルことはできません:私は、生成されたプロジェクトをコンパイルしようとするとエラーLNK1104:オープンファイル「デバッグ MyProjectLib.lib」が

cmake_minimum_required(VERSION 2.8.12) 
project(MyProject) 

find_package(Qt5Widgets) 

set(MyProjectLib_src ${PROJECT_SOURCE_DIR}/gui.cpp) 
set(MyProjectLib_hdr ${PROJECT_SOURCE_DIR}/gui.h) 
set(MyProjectLib_ui ${PROJECT_SOURCE_DIR}/gui.ui) 
set(MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp) 

qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr}) 
qt5_wrap_ui (MyProjectLib_ui_moc ${MyProjectLib_ui}) 

include_directories(${PROJECT_SOURCE_DIR}) 
include_directories(${PROJECT_BINARY_DIR}) 

add_library(MyProjectLib SHARED 
    ${MyProjectLib_src} 
    ${MyProjectLib_hdr_moc} 
    ${MyProjectLib_ui_moc} 
) 
target_link_libraries(MyProjectLib Qt5::Widgets) 

add_executable(MyProject ${MyProjectBin_src}) 
target_link_libraries(MyProject MyProjectLib) 

を、私が得た以下のエラー:

error LNK1104: cannot open file 'Debug\MyProjectLib.lib'

対応するディレクトリDebugは含まれています

MyPtojectLib.dll 
MyProjectLib.ilk 
MyProjectLib.pdb 

答えて

2

あなたはMyProjectLibを共有ライブラリとして宣言しました。ライブラリのシンボルのすべてまたは一部をエクスポートしない限り、実行時に読み込まれるように.dllが設定され、試しているときにコンパイル時にリンクするコードは.libになりませんする。

迅速な解決には、静的ライブラリとしてMyProjectLibを宣言することがあります

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) 

add_library(MyProjectLib STATIC ...) 

別のオプションは、すべてのシンボルを(this articleを参照)をエクスポートするには、「新しい」cmakeの機能を使用することができ

this answer(長い回答)のように、エクスポートするシンボルを明示的に宣言することによって、 "従来の"方法を使用することもできます。 MyProjectLib_EXPORTSが自動的に共有ライブラリのためにcmakeによって生成されていることを

#ifdef MyProjectLib_EXPORTS 
#define MyProjectLib_API __declspec(dllexport) 
#else 
#define MyProjectLib_API __declspec(dllimport) 
#endif 

注:あなたはこれを気にする必要はありませんあなたはまず、あなたのコード内のいくつかのAPIマクロどこかを宣言する必要があります。次に、あなたのコード内のクラスごとに宣言でマクロを使用:MyProjectLibをコンパイルするときMyProjectLib_EXPORTSが定義されますので、

class MyProjectLib_API MyClass { /* ... */ }; 

MyClassは、エクスポートされたシンボルになり、MyProjectLib_APIは__declspec(dllexport)に展開されます。したがって、.libファイルにエクスポートされます。

MyProjectLib_EXPORTSは定義されておらず、__declspec(dllimport)に拡張されるため、MyProjectLibとリンクするときにインポートされる記号になります。


また、このようなあなたのcmakeのファイルを向上させることがあります。あなたはcmakeのは、自動的にQtのユーティリティへの呼び出しを処理できるようにする代わりにAUTOMOCAUTOUICを使用することができ

qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr}) 
qt5_wrap_ui (MyProjectLib_ui_moc ${MyProjectLib_ui}) 

include_directories (${PROJECT_SOURCE_DIR}) 
include_directories (${PROJECT_BINARY_DIR}) 

PROJECT_SOURCE_DIRデフォルトでディレクトリを含めると、あなたがここにPROJECT_BINARY_DIRを追加する必要があり、なぜ私が見ることができないです。ただ、これらの行を削除します。

は一度きれいに、あなたのcmakeのファイルは、このようなものになることがあります。

cmake_minimum_required(VERSION 2.8.12) 
project(MyProject) 

set(CMAKE_AUTOMOC ON) 
set(CMAKE_AUTOUIC ON) 

find_package(Qt5Widgets) 

set(MyProjectLib_src 
    ${PROJECT_SOURCE_DIR}/gui.cpp 
    ${PROJECT_SOURCE_DIR}/gui.h 
    ${PROJECT_SOURCE_DIR}/gui.ui 
) 

add_library(MyProjectLib STATIC 
    ${MyProjectLib_src} 
) 
target_link_libraries(MyProjectLib Qt5::Widgets) 

set(MyProjectBin_src ${PROJECT_SOURCE_DIR}/main.cpp) 

add_executable(MyProject 
    ${MyProjectBin_src} 
) 
target_link_libraries (MyProject MyProjectLib) 
+0

あなたは私の他のポストを見直すください http://stackoverflow.com/questions/40746444/combining-two-solution-in -one-using-cmake?noredirect = 1#コメント68742304_40746444 – test11

関連する問題