具有两个具有自己的CMakeLists.txt的子项目的CMakeLists.txt只需要创建一个包含所有的.so库

时间:2013-12-16 01:20:25

标签: c++ g++ cmake shared-libraries

我有三个共享库:lib_1.so,lib_2.so和lib_3.so。 如何只创建一个名为lib_all.so的库,它们将包含所有三个库?

我正在尝试编译一些源文件,其中包含来自两个子项目/子目录的文件,每个子项目(2)都有CMakeLists.txt,但我想创建一个.so库,而不是三个。

加入 我想要那个medium.so还包含libnoise.so和noiseutils.so,这是我的CMakeLists.txt

project (map)
cmake_minimum_required(VERSION 2.8)

find_package(PythonLibs)
include_directories (${PYTHON_INCLUDE_DIRS})

find_package(Boost 1.45.0 COMPONENTS python)
include_directories (${Boost_INCLUDE_DIRS})
set (LIBNOISE_PATH ${MY_SOURCE_DIR}/libnoise)
set (LIBNOISEUTILS_PATH ${MY_SOURCE_DIR}/noiseutils)


add_subdirectory(libnoise)
add_subdirectory(noiseutils)

add_library (
    map SHARED  
    Wrapped.cpp
)


target_link_libraries (
    map
    boost_python
    ${PYTHON_LIBRARIES}
    ${Boost_LIBRARIES}
)

linoise和noiseutils是具有自己的CMakeLists.txt

的目的地

1 个答案:

答案 0 :(得分:2)

您无法将多个共享库合并到一个共享库中。您也无法将多个静态库合并到一个静态库中。

但是,您可以将多个静态库合并到一个共享库中。

这更多是底层编译器的限制,而不是CMake的限制。您可以将静态库与对象文件和共享库视为可执行文件:您可以将多个目标文件链接到单个可执行文件中,但其他排列组合并不能很好地工作。

因此,在您的情况下,对add_library([...] STATIC)noise库使用noiseutils,为add_library([...] SHARED)库使用medium。然后只需添加target_link_libraries(medium noise noiseutils)即可完成作业。