CMAKE:构建库并链接它

aSt*_*eve 12 makefile cmake

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

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)
Run Code Online (Sandbox Code Playgroud)

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

link_directories(${MyProj_BINARY_DIR})
Run Code Online (Sandbox Code Playgroud)

没什么区别.

我有一些(相互关联的)问题:

  1. 强制cmake将我的库和可执行文件构建到"临时目录"(比如MyStage)以保持目标与源分离的最佳方法是什么?
  2. 我如何说服cmake将应用程序链接到库?
  3. 如果我想构建一个调试版本和发布版本,那么扩展我的cmake脚本的最佳方法是什么 - 确保调试应用程序链接调试库和发布应用程序针对发布库?

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

Ser*_*lov 26

嗯,最好阅读示例并做出确切建议的内容.

cmake_minimum_required (VERSION 2.6)
project (MyProj CXX)
add_subdirectory(MyLib)
add_subdirectory(MyApp)
Run Code Online (Sandbox Code Playgroud)

然后,对于指定的每个子目录,都会创建CMakeLists.txt文件

MyLib中\的CMakeLists.txt

file(GLOB SRC_FILES *.cpp)
add_library(MyLib ${SRC_FILES})
Run Code Online (Sandbox Code Playgroud)

MyApp的\的CMakeLists.txt

file(GLOB SRC_FILES *.cpp)
add_executable(MyApp ${SRC_FILES})
target_link_libraries(MyApp MyLib) 
Run Code Online (Sandbox Code Playgroud)


kra*_*lyk 4

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

    cmake <源路径,可能是相对的>
  2. 要么使用

    link_directories(${MyProj_BINARY_DIR}/MyLib)

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

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

    cmake -DCMAKE_BUILD_TYPE=调试