CMake:如何在目标之间重用源文件定义而不重复?
在我的CMake项目中,我有两个目标(静态库和共享库),它们共享相同的源代码文件,如下所示:CMake:如何在目标之间重用源文件定义而不重复?,cmake,Cmake,在我的CMake项目中,我有两个目标(静态库和共享库),它们共享相同的源代码文件,如下所示: add_library("${PROJECT_NAME}" STATIC "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h" "${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp" "${PROJECT_SOURCE_DIR}/include/cal
add_library("${PROJECT_NAME}" STATIC
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
"${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)
add_library("${PROJECT_NAME}-shared" SHARED
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
"${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)
显然,这里有一个问题:源定义是重复的。它很难维护,而且容易出错
为了避免这种情况,我想创建一个CMake list变量,以便可以在两个目标中重用源定义
我试过这个,但不起作用:
set(CALCULATOR_CORE_SOURCES_LIST
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp"
"${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h"
"${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp"
)
string(REPLACE ";" " " CALCULATOR_CORE_SOURCES "${CALCULATOR_CORE_SOURCES_LIST}")
add_library("${PROJECT_NAME}" STATIC ${CALCULATOR_CORE_SOURCES})
add_library("${PROJECT_NAME}-shared" SHARED ${CALCULATOR_CORE_SOURCES})
它失败,错误为:找不到源文件。
所以。。。如果没有这种重复,我如何在目标之间重用源文件定义?是否可以使用列表来完成此操作,或者是否有更好的方法来解决此问题
PS:我正在使用CMake 3.15,你的代码很接近;您只需使用
CALCULATOR\u CORE\u SOURCES\u LIST
变量将源/头组添加到两个add\u library()
调用:
set(CALCULATOR_CORE_SOURCES_LIST
${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.h
${PROJECT_SOURCE_DIR}/src/calculator/core/ShuntingYard.cpp
${PROJECT_SOURCE_DIR}/include/calculator/core/Calculator.h
${PROJECT_SOURCE_DIR}/src/calculator/core/Calculator.cpp
)
add_library(${PROJECT_NAME} STATIC ${CALCULATOR_CORE_SOURCES_LIST})
add_library(${PROJECT_NAME}-shared SHARED ${CALCULATOR_CORE_SOURCES_LIST})
如果两个库的源组相同,则只需定义一次列表。从文档中,该命令将执行以下操作:
多个参数将作为分号分隔的列表连接起来,以形成要设置的实际变量值
因此,可以将此列表传递给
add\u library()
调用。您也不应该在每个文件周围使用引号(“
)。它起作用了!比我想象的要简单得多!我不知道add_库可以直接接受列表(我认为它只能处理以空格分隔的源值)。它甚至可以在集合()中的文件周围使用双引号(“)调用和add_library()调用中的变量展开。我在每个变量扩展和文件路径值定义上使用引号作为一个好的默认值。。。有些情况下不建议使用引号?@hbobenicio有些情况下引号很有用,但在许多情况下,你根本不需要引号。关于在变量周围使用引号的含义,有一个很好的解释。