【问题标题】:CMAKE: Build library and link against itCMAKE:构建库并链接它
【发布时间】:2011-12-10 19:16:48
【问题描述】:

我正在尝试使用 cmake(在带有 GNU make 和 g++ 的 Linux 上)构建一个包含两个子目录的项目:MyLib 和 MyApp。 MyLib 包含静态库的源代码; MyApp 需要链接到该库。我正在尝试使用以下 CMakeLists.txt 在 Linux 上构建生成的 makefile:

cmake_minimum_required (VERSION 2.6)
project (MyProj)
include_directories (MyLib)
file(GLOB MyLibSrc MyLib/*.cpp)
add_library(MyLibrary STATIC ${MyLibSrc})
file(GLOB MyAppSrc MyApp/*.cpp)
add_executable(MyApplication ${MyAppSrc})
target_link_libraries(MyApplication MyLibrary)

这“几乎”有效。它在链接时失败,因为它生成 libMyLibrary.a - 它位于根目录中。当我添加:

link_directories(${MyProj_BINARY_DIR})

没什么区别。

我有几个(相互关联的)问题:

  1. 强制 cmake 将我的库和可执行文件构建到“暂存目录”(例如 MyStage)以保持目标与源分开的最佳方法是什么?
  2. 如何说服 cmake 将应用程序与库链接?
  3. 如果我想构建一个调试版本和一个发布版本,扩展我的 cmake 脚本以执行此操作的最佳方法是什么 - 确保调试应用程序链接到调试库和发布应用程序链接到发布库?李>

我是 cmake 的新手。我已经阅读了我在网上可以找到的内容,但发现自己很难让我的库与我的可执行文件链接。在我看来,这种配置应该很常见。一个婴儿床的例子会很有帮助,但我还没有找到。

【问题讨论】:

    标签: makefile cmake


    【解决方案1】:

    好吧,最好阅读此example 并按照建议进行操作。

    cmake_minimum_required (VERSION 2.6)
    project (MyProj CXX)
    add_subdirectory(MyLib)
    add_subdirectory(MyApp)
    

    然后为每个指定的子目录创建 CMakeLists.txt 文件

    MyLib\CMakeLists.txt

    file(GLOB SRC_FILES *.cpp)
    add_library(MyLib ${SRC_FILES})
    

    MyApp\CMakeLists.txt

    file(GLOB SRC_FILES *.cpp)
    add_executable(MyApp ${SRC_FILES})
    target_link_libraries(MyApp MyLib) 
    

    【讨论】:

      【解决方案2】:
      1. 使用“脱离源代码构建”。创建一个仅用于构建的目录,并在其中调用

        cmake 
      2. 任意使用

        link_directories(${MyProj_BINARY_DIR}/MyLib)

        或在每个子目录中创建 CMakeLists.txt - 这对于较大的项目比非常小的项目更好。

      3. 这有点棘手,请查看文档中的 CMAKE_BUILD_TYPE(您可以设置它和/或通过它“如果”)。您也可以从命令行设置它:

        cmake -DCMAKE_BUILD_TYPE=调试

      【讨论】:

      • 我可以看到 (1) 是如何工作的——尽管我不认为它很整洁。如果可以的话,我不希望 CMakeLists.txt 在我的库旁边的“暂存目录”中。
      • 嗯,不,不,CMakeLists.txt 留在源代码树中。作为参数传递给 cmake 的路径是包含顶级 CMakeLists.txt 的目录。在此设置中,“暂存”目录在调用 cmake 之前完全为空。
      【解决方案3】:

      我发现了 (1) 的“最佳”解决方案......所以,我想我应该把它贴在这里:

      SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage)
      SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage)
      

      之前让我感到困惑的是静态库不被 Cmake 视为 LIBRARY - 它们被视为 ARCHIVE。

      【讨论】:

      • 我找到的唯一有用的答案!里面的命名好混乱!
      【解决方案4】:

      不要在根 Cmakelists.txt 中添加库和可执行文件。在子目录的 Cmakelists.txt 中添加这些库和可执行文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-25
        • 2019-08-03
        • 2019-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        • 1970-01-01
        相关资源
        最近更新 更多