目录如下:
./step3是我们的这个项目工程目录,./step3/MathFuncions/下存在第三静态库libMathFunciotns.a,提供mysqrt()函数。
r如何通过cmake传递宏给CMakeLists.txt以决定是否链接第三方库,源文件中是调用第三方库的mysqrt()还是标准库的sqr()
step3/--
|---build
|---MathFuntion/
|---mysqrt.cxx
|---MathFunctions.h
|--CMakeLists.txt
|---Tutorial.cxx
|---TutorialConfig.h.in
|---CMakeLists.txt
1.先看主CMakeLists.txt
点击查看代码
cmake_minimum_required(VERSION 3.10)
# 1.设置工程名和版本号。
#这将使得Tutorial_VERSION_MAJOR为1,Tutorial_VERSION_MINOR=0
project(Tutorial VERSION 1.0)
# 2.指定使用c++标准.必须位于所有add_**调用之前
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)
# 3. 定义选项变量。必须位于configure_file()之前
# 选项变量是缓存变量,在该文件修改其值将不起作用。
# 只能通过cmake ../CMakeLists.txt -DUSE_MYMATH=OFF修改
option(USE_MYMATH "Use tutorial provided math implementation" ON)
# 4. 基于TutorialConfig.h.in生成 TutorialConfig.h
configure_file(TutorialConfig.h.in TutorialConfig.h)
#5. cmake 的if语句。USE_MYMATH变量的值有cmake -DUSE_MYMATH=OFF或ON控制
if(USE_MYMATH)
# 子目录:为${CMAEK_CURRENT_SOURCE_DIR}/MathFunctions
# 调用该函数将会调用子目录下CMakeLists.txt,输出文件在
# 构建目录:${PROJECT_SOURCE_DIR}/MathFunctions/build
add_subdirectory(MathFunctions ${PROJECT_SOURCE_DIR}/MathFunctions/build)
list(APPEND EXTRA_LIBS MathFunctions)
list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/MathFunctions )
endif()
message(EXTRA_LIBS=${EXTRA_LIBS},EXTRA_INCLUDES=${EXTRA_INCLUDES},BUILD_SHARED_LIBS=${BUILD_SHARED_LIBS},USE_MYMATH=${USE_MYMATH},
CMAKE_LIBRARY_PATH=${CMAKE_LIBRARY_PATH})
# 6.生成可执行文件
add_executable(Tutorial tutorial.cxx)
#7. 指定target的链接库名。这里为可执行文件Tutorial连接库${EXTRA_LIBS}。target也可为库文件。
#
target_link_libraries(Tutorial PUBLIC ${EXTRA_LIBS})
#8. 指定target的所需头文件的路径
target_include_directories(Tutorial PUBLIC
${PROJECT_BINARY_DIR}
${EXTRA_INCLUDES}
)
TutorialConfig.h.in如下:
#define Tutorial_VERSION_MAJOR @Tutorial_VERSION_MAJOR@
#define Tutorial_VERSION_MINOR @Tutorial_VERSION_MINOR@
#cmakedefine USE_MYMATH
在./step3/build/是我们的构建目录,在该目录下执行cmake ../CMakeLists.txt -DUSE_MYMATH=ON
不仅在该目录下生成Cmakefile,还基于TutorialConfig.h.in修改生成TutorialConfig.h
- Tutorial_VERSION_MAJOR变量的值替换@Tutorial_VERSION_MAJOR@
- Tutorial_VERSION_MINOR变量的值替换@Tutorial_VERSION_MINOR@
- USE_MYMATH若为ON,#cmakedefine USE_MYMATH修改为#define USE_MYMATH。否则不定义#define USE_MYMATH
ps:
CMAKE_SOURCE_DIR:最顶层CMakeLists.txt所在目录
CMAKE_BIN_DIR:cmake调用最顶层CMakeLists.txt的工作目录
project_SOURCE_DIR:最近调用project()的CMakeLists.txt所在目录
project_BIN_DIR:cmake调用最近调用project()的CMakeLists.txt的工作目录
CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt的所在目录,这是当前CMakeLists.txt中文件名的路径
CMAKE_CUREENT_BIN_DIR:当前CMakeLists.txt的构建目录
eg: