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

kzh*_*dev 5 cmake

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

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

...
add_definition(-Dfoo -Dbar)
add_library(shared ${SOURCES})
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txtexe1文件夹中:

...
add_executable(exe1 ${SOUCE_FILES})
add_dependencies(exe1 shared)
# <How Do I append -DForExe1 compile definition to shared>?
target_link_libraries(exe1 shared)
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txtexe2文件夹中:

...
add_executable(exe2 ${SOURCES})
add_dependentcies(exe2 shared)
# <How Do I append -DForExe2 compile definition to shared>?
target_link_libraries(exe2 shared)
Run Code Online (Sandbox Code Playgroud)

我如何在 CMake 中执行此操作?

Tsy*_*rev 5

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

不同的编译定义意味着不同的编译动作,产生不同的目标文件。但这会破坏库的概念,因为库已经编译(并且链接,如果是共享库)。


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

# 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)
Run Code Online (Sandbox Code Playgroud)

需要时可以使用生成的库:

add_executable(exe1 ${SOUCE_FILES})
target_link_libraries(exe1 lib_exe1)
Run Code Online (Sandbox Code Playgroud)

如果您的库应该针对某些编译定义进行参数化,请考虑创建一个 CMake 函数/宏,它会在需要时创建一个库实例:

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()
Run Code Online (Sandbox Code Playgroud)

用法:

add_executable(exe1 ${SOUCE_FILES})
add_lib_for(lib_exe1 Exe1)
target_link_libraries(exe1 lib_exe1)
Run Code Online (Sandbox Code Playgroud)