你宣布MyProjectLib
作为共享库,因此除非导出库的全部或部分符号,否则您将只有一个.dll
设计为在运行时加载,并且没有.lib
正如您尝试做的那样,在编译时进行链接。
一个快速的解决方案可能是声明MyProjectLib
作为静态库:
add_library(MyProjectLib STATIC ...)
另一种选择可能是使用“新”cmake 功能来导出所有符号(请参阅本文):
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
您还可以通过显式声明要导出的符号来使用“传统”方式,例如这个答案(长答案)。您首先需要在代码中的某处声明一些 API 宏:
#ifdef MyProjectLib_EXPORTS
#define MyProjectLib_API __declspec(dllexport)
#else
#define MyProjectLib_API __declspec(dllimport)
#endif
注意MyProjectLib_EXPORTS
由 cmake 自动为共享库生成:您不需要关心这一点。然后,对于代码中的每个类,在声明中使用宏:
class MyProjectLib_API MyClass { /* ... */ };
MyClass
编译时将是导出的符号MyProjectLib
因为MyProjectLib_EXPORTS
将被定义,并且 MyProjectLib_API 将扩展为__declspec(dllexport)
。所以它将被导出为.lib
file.
链接时它将是一个导入的符号MyProjectLib
因为MyProjectLib_EXPORTS
将是未定义的,并且MyProjectLib_API
将扩展到__declspec(dllimport)
.
您还可以像这样改进您的 cmake 文件:
qt5_wrap_cpp(MyProjectLib_hdr_moc ${MyProjectLib_hdr})
qt5_wrap_ui (MyProjectLib_ui_moc ${MyProjectLib_ui})
您可以使用AUTOMOC
and AUTOUIC
相反,让 cmake 自动处理对 Qt 实用程序的调用。
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)