2016-11-22 120 views
1

我有以下CMakeLists.txt文件生成基於Qt我的項目:錯誤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作爲靜態庫:

add_library(MyProjectLib STATIC ...) 

另一種選擇可能是用「新」的cmake功能導出所有符號(見this article):

set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) 

您還可以通過明確聲明要導出的符號來使用「傳統」方式,如this answer(長答案)。首先你需要在你的代碼的某個地方聲明一些API宏:

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

注意MyProjectLib_EXPORTS是自動CMake的共享庫生成的:你不需要關心這個。然後對於每個在你的代碼的類,使用宏在聲明:編譯MyProjectLib因爲MyProjectLib_EXPORTS將被定義時

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

MyClass將是一個導出的符號,並MyProjectLib_API將擴大到__declspec(dllexport)。所以它會被導出到.lib文件中。

由於MyProjectLib_EXPORTS將被定義,並且MyProjectLib_API將擴展到__declspec(dllimport),因此在與MyProjectLib進行鏈接時它將是導入的符號。


您還可以改善你的CMake文件是這樣的:

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

您可以使用AUTOMOCAUTOUIC,而不是讓CMake的自動處理呼叫Qt的工具。

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

PROJECT_SOURCE_DIR是默認的include目錄,我不明白爲什麼你需要添加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 - 酮使用-cmake的?noredirect = 1#comment68742304_40746444 – test11

相關問題