CMAKE:构建库并链接它

时间:2011-10-19 10:07:16

标签: makefile cmake

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

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脚本的最佳方法是什么 - 确保调试应用程序链接调试库和发布应用程序针对发布库?
  4. 我是cmake的新手。我已经阅读了我在网上可以找到的内容,但发现自己很难让我的库与我的可执行文件链接。在我看来,这种配置应该很常见。一个小便的例子会很有帮助,但我找不到一个。

4 个答案:

答案 0 :(得分:21)

嗯,最好先阅读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) 

答案 1 :(得分:4)

  1. 使用“源代码构建”。创建一个仅用于构建的目录,并在其中调用

    cmake <path to the sources, it may be relative>
  2. 使用

    link_directories(${MyProj_BINARY_DIR}/MyLib)

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

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

    cmake -DCMAKE_BUILD_TYPE=Debug

答案 2 :(得分:4)

我发现了(1)的'最佳'解决方案......所以,我想我应该在这里发布:

SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY MyStage)
SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY MyStage)

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

答案 3 :(得分:0)

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