我有一个共享库libShared
,用于构建不同的可执行文件。我想做的是基于构建可执行文件,以便为共享库添加额外的编译定义。
CMakeLists.txt
文件夹中的 lib
:
...
add_definition(-Dfoo -Dbar)
add_library(shared ${SOURCES})
CMakeLists.txt
文件夹中的 exe1
:
...
add_executable(exe1 ${SOUCE_FILES})
add_dependencies(exe1 shared)
# <How Do I append -DForExe1 compile definition to shared>?
target_link_libraries(exe1 shared)
CMakeLists.txt
文件夹中的 exe2
:
...
add_executable(exe2 ${SOURCES})
add_dependentcies(exe2 shared)
# <How Do I append -DForExe2 compile definition to shared>?
target_link_libraries(exe2 shared)
我如何在CMake中执行此操作?
答案 0 :(得分:3)
一个无法 单个库目标与不同的编译定义。
不同的编译定义意味着不同的编译操作,导致不同的对象文件。但是,如果已经编译(并且在共享库的情况下链接),这会使库的概念失败。
如果您为库设置了少量可能的编译定义',则可以为每个集定义库目标:
# 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)
如果您的库应该针对某些编译定义进行参数化,请考虑创建一个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()
用法:
add_executable(exe1 ${SOUCE_FILES})
add_lib_for(lib_exe1 Exe1)
target_link_libraries(exe1 lib_exe1)