CMake:如何将额外的编译定义附加到依赖库构建中

CMake:如何将额外的编译定义附加到依赖库构建中,cmake,Cmake,我有一个共享库,libShared,用于构建不同的可执行文件。我要做的是基于构建可执行文件向共享库添加额外的编译定义 CMakeLists.txt在我的lib文件夹中: ... add_definition(-Dfoo -Dbar) add_library(shared ${SOURCES}) ... add_executable(exe1 ${SOUCE_FILES}) add_dependencies(exe1 shared) # <How Do I append -DForExe1

我有一个共享库,
libShared
,用于构建不同的可执行文件。我要做的是基于构建可执行文件向共享库添加额外的编译定义

CMakeLists.txt
在我的
lib
文件夹中:

...
add_definition(-Dfoo -Dbar)
add_library(shared ${SOURCES})
...
add_executable(exe1 ${SOUCE_FILES})
add_dependencies(exe1 shared)
# <How Do I append -DForExe1 compile definition to shared>?
target_link_libraries(exe1 shared)
...
add_executable(exe2 ${SOURCES})
add_dependentcies(exe2 shared)
# <How Do I append -DForExe2 compile definition to shared>?
target_link_libraries(exe2 shared)
exe1
文件夹中的
CMakeLists.txt

...
add_definition(-Dfoo -Dbar)
add_library(shared ${SOURCES})
...
add_executable(exe1 ${SOUCE_FILES})
add_dependencies(exe1 shared)
# <How Do I append -DForExe1 compile definition to shared>?
target_link_libraries(exe1 shared)
...
add_executable(exe2 ${SOURCES})
add_dependentcies(exe2 shared)
# <How Do I append -DForExe2 compile definition to shared>?
target_link_libraries(exe2 shared)

如何在CMake中实现这一点?

一个不能具有具有不同编译定义的单个库目标

不同的编译定义意味着不同的编译操作,导致不同的对象文件。但这将打破图书馆的概念,因为它是已经编译过的(在共享图书馆的情况下是链接的)


如果为库设置了少量可能的编译定义,则可以为每个集合定义库目标:

# Common definitions for any library.
add_definition(-Dfoo -Dbar)
# Common sources for any library
set(LIB_SOURCES ...)

# The library specialized for exe1.
add_library(lib_exe1 SHARED ${LIB_SOURCES})
# Library-specific definitions
target_compile_definitions(lib_exe1 PRIVATE -DForExe1)

# The library specialized for exe2.
add_library(lib_exe2 SHARED ${LIB_SOURCES})
# Library-specific definitions
target_compile_definitions(lib_exe2 PRIVATE -DForExe2)
在需要时,可以使用生成的库:

add_executable(exe1 ${SOUCE_FILES})
target_link_libraries(exe1 lib_exe1)
function(add_lib_for lib_name purpose_name)
    add_library(${lib_name} SHARED <sources>)
    target_compile_definitions(${lib_name} PRIVATE
        -Dfoo -Dbar # Common definitions
        -DFor${purpose_name} # Specific definition
    )
endfunction()

如果您的库应该为一些编译定义参数化,考虑创建一个CGuffE函数/宏,它在需要时创建一个库实例:

add_executable(exe1 ${SOUCE_FILES})
target_link_libraries(exe1 lib_exe1)
function(add_lib_for lib_name purpose_name)
    add_library(${lib_name} SHARED <sources>)
    target_compile_definitions(${lib_name} PRIVATE
        -Dfoo -Dbar # Common definitions
        -DFor${purpose_name} # Specific definition
    )
endfunction()

谢谢你的回复。我的两个可执行文件永远不会一起构建。它们只是两种不同的口味。由于共享库是一个依赖项,我希望在构建可执行文件时,共享库将使用不同的定义进行构建。如果不可能,那么使用CMake函数似乎是一个不错的选择。是否可以将用途名称更改为定义列表?谢谢。
是否可以将用途名称更改为定义列表?
-如果您想了解函数的参数,则可以向函数传递可变数量的参数(并对其进行处理)。如果要编译定义,可以将多个
-D
选项传递到
目标编译定义
命令。可能不需要
-D
选项。。我将在稍后对此进行调查。