【问题标题】:CMakeLists.txt with two subprojects with own CMakeLists.txt needs to create only one .so library which contains allCMakeLists.txt 有两个子项目和自己的 CMakeLists.txt 只需要创建一个 .so 库,其中包含所有
【发布时间】:2013-12-16 01:20:25
【问题描述】:

我有三个共享库: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 的子目录

【问题讨论】:

  • 不可能,除非你有这三个的来源。如果它们是静态库 (.a),那就可以了。
  • @SevaAlekseyev 我有这三个的来源,但是当我使用 cmake 时它会创建三个,我需要一个
  • @PaolaJ 然后我建议重新表述你的问题。
  • @PeterHorvath 我重新提出了问题,有什么解决方案吗? :)
  • @PaolaJ。到我没有的重新制定的版本。 :-) 也许其他人。

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 2022-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多