CMake add_library包含其他库

tjw*_*992 1 c++ cmake shared-libraries

我正在设计可以在我的其他C ++项目中链接的库的集合。为了使该集合易于使用,我希望能够链接到各个库,或者链接到包含所有其他库的一个主库。如何在CMakeLists.txt文件中指定?

例如:

add_library(library1 SHARED
    file1.cpp
    file2.cpp
)

add_library(library2 SHARED
    file3.cpp
    file4.cpp
)

# Define a master library that contains both of the others
add_library(master_library SHARED
    library1
    library2
)
Run Code Online (Sandbox Code Playgroud)

是否有使用CMake获得此功能的正确方法?


编辑:

这个问题不是重复的:CMake:是否可以仅从静态库而不从源构建可执行文件?

这仅与共享库有关,与静态库或可执行文件无关。

tjw*_*992 7

此解决方案似乎有效。

add_library(library1 SHARED
    file1.cpp
    file2.cpp
)

add_library(library2 SHARED
    file3.cpp
    file4.cpp
)

# dummy file is required to avoid a cmake error, but this
# "dummy" file serves no other purpose and is empty.
add_library(master_library SHARED
    dummy.cpp
)

# Link the master library with the other libraries
target_link_libraries(master_library
    library1
    library2
)
Run Code Online (Sandbox Code Playgroud)

完成此操作后,我只能使用主库来编译和链接代码。


Cal*_*itt 5

如果您想要的只是一个方便其他人使用的目标,并且不关心您是否有一个或多个库,那么 cmake 可以使用接口库来做到这一点:

add_library(library1 SHARED
    file1.cpp
    file2.cpp
)

add_library(library2 SHARED
    file3.cpp
    file4.cpp
)

add_library(master_library INTERFACE)

# Link the master library with the other libraries
target_link_libraries(master_library INTERFACE
    library1
    library2
)
Run Code Online (Sandbox Code Playgroud)

然后在另一个位置(如果有)

target_link_libraries(my_executable PRIVATE
    master_library
)
Run Code Online (Sandbox Code Playgroud)

my_executable将链接到library1library2