我目前正在使用递归make和自动工具,并希望为一个类似于以下内容的项目迁移到CMake:

lx/ (project root)
    src/
        lx.c (contains main method)
        conf.c
        util/
            str.c
            str.h
            etc.c
            etc.h
        server/
            server.c
            server.h
            request.c
            request.h
        js/
            js.c
            js.h
            interp.c
            interp.h
    bin/
        lx (executable)

我该怎么做呢?

推荐答案

如果没有比lx/src目录更高的源代码,那么就不需要lx/CMakeLists.txt文件.如果有,应该是这样的:

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(lx)

add_subdirectory(src)
add_subdirectory(dir1)
add_subdirectory(dir2)

# And possibly other commands dealing with things
# directly in the "lx" directory

.其中子目录是按库依赖顺序添加子目录的.应该首先添加不依赖于其他任何东西的库,然后再添加依赖于这些库的库,依此类推.

lx/src/CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
project(lx_exe)

add_subdirectory(util)
add_subdirectory(js)
add_subdirectory(server)

set(lx_source_files conf.c lx.c)
add_executable(lx ${lx_source_files})

target_link_libraries(lx server)
  # also transitively gets the "js" and "util" dependencies

lx/src/util/CMakeLists.txt

set(util_source_files
  etc.c
  etc.h
  str.c
  str.h
)
add_library(util ${util_source_files})

lx/src/js/CMakeLists.txt

set(js_source_files
  interp.c
  interp.h
  js.c
  js.h
)
add_library(js ${js_source_files})

target_link_libraries(js util)

lx/src/server/CMakeLists.txt

set(server_source_files
  request.c
  request.h
  server.c
  server.h
)
add_library(server ${server_source_files})

target_link_libraries(server js)
  # also transitively gets the "util" dependency

然后,在命令提示符中:

mkdir lx/bin
cd lx/bin

cmake ..
  # or "cmake ../src" if the top level
  # CMakeLists.txt is in lx/src

make

默认情况下,lx可执行文件将使用这个精确的布局最终位于"lx/bin/src"目录中.您可以通过使用RUNTIME_OUTPUT_directory target属性和set_property命令来控制它的最终目录.

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_tgt:RUNTIME_OUTPUT_DIRECTORY

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:set_property

如果库通过add_library构建为CMake目标,则可以通过CMake目标名称引用target_link_library库,否则可以通过库文件的完整路径引用.

另请参见"cmake--help-command target_link_library"或任何其他cmake命令的输出,以及可在此处找到的cmake命令的完整联机文档:

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#section_Commands

http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:target_link_libraries

C++相关问答推荐

当它们都是字符时,为什么我不能使用 strcat 组合这两个字符?

从 C 文件调用 C++ 标准头文件 (cstdint)

为双指针的顶层分配内存

使用管道在两个程序之间进行通信

从指向其第二个成员的指针获取指向结构的指针是否合法?

在数组中查找与数组均值相同的对

代码块输出不同于在线编译器

如何解读一个单词并在 C 的 txt 文件中找到它的所有匹配项?

c 函数是否可以同时接受双精度和长双精度参数?

为什么`(char)~0`和`(unsigned char)~0`返回不同宽度的值?

我们可以在变量名中写注释吗?

在结构数组的末尾需要空括号“{}”是什么?

如果缺少 const char* 数组初始化逗号,则生成编译器警告

为什么glibc的strlen需要这么复杂才能快速运行?

为什么不鼓励静态链接 glibc?

编译 HTK 时出现“致命错误:bits/libc-header-start.h:没有这样的文件或目录”

使用指向过去的 malloc 的指针是否定义明确?

如果不在内存中,表达式和常量存储在哪里?

如何使用 C 获取 Linux 中的 CPU 数量?

这个 [1] 在结构声明末尾的目的是什么?