谷歌翻译
在本节中,我们将展示BUILD_SHARED_LIBS变量可用于控制add_library(),并允许控制如何构建没有明确类型( STATIC、 SHARED或)MODULE的库。OBJECT
为了实现这一点,我们需要添加BUILD_SHARED_LIBS到顶层CMakeLists.txt。我们使用option()命令,因为它允许用户随意选择值是否应该是ON或OFF。
CMakeLists.txt
option(BUILD_SHARED_LIBS “Build using shared libraries” ON)
接下来,我们需要为静态库和共享库指定输出目录。
CMakeLists.txt
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY “
P
R
O
J
E
C
T
B
I
N
A
R
Y
D
I
R
"
)
s
e
t
(
C
M
A
K
E
L
I
B
R
A
R
Y
O
U
T
P
U
T
D
I
R
E
C
T
O
R
Y
"
{PROJECT_BINARY_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "
PROJECTBINARYDIR")set(CMAKELIBRARYOUTPUTDIRECTORY"{PROJECT_BINARY_DIR}”)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY “${PROJECT_BINARY_DIR}”)
option(BUILD_SHARED_LIBS “Build using shared libraries” ON)
最后,更新MathFunctions/MathFunctions.h以使用 dll 导出定义:
MathFunctions/MathFunctions.h
#if defined(_WIN32)
if defined(EXPORTING_MYMATH)
define DECLSPEC __declspec(dllexport)
else
define DECLSPEC __declspec(dllimport)
endif
#else // non windows
define DECLSPEC
#endif
namespace mathfunctions {
double DECLSPEC sqrt(double x);
}
此时,如果您构建了所有内容,您可能会注意到链接失败,因为我们正在将没有位置独立代码的静态库与具有位置独立代码的库组合在一起。 解决方案是明确设置POSITION_INDEPENDENT_CODETrue在构建共享库时,SqrtLibrary 的目标属性。
MathFunctions/CMakeLists.txt
state that SqrtLibrary need PIC when the default is shared libraries
set_target_properties(SqrtLibrary PROPERTIES
POSITION_INDEPENDENT_CODE ${BUILD_SHARED_LIBS}
)
定义EXPORTING_MYMATH说明我们declspec(dllexport)在 Windows 上构建时使用的内容。
MathFunctions/CMakeLists.txt
define the symbol stating we are using the declspec(dllexport) when
building on windows
target_compile_definitions(MathFunctions PRIVATE “EXPORTING_MYMATH”)
练习:我们进行了修改MathFunctions.h以使用 dll 导出定义。使用 CMake 文档,您能找到一个辅助模块来简化这一过程吗?