CMake configure_file未包含在静态库中

时间:2019-04-18 12:09:53

标签: c++ build cmake

目录结构如下:

project
   | ...
   | CMakeLists.txt
   | - build/
         | - bench/
               | libbench_main.a  // static library containing symbols
               | foo.h
   | - bench/
         | - bench_main.cc
         | - CMakeLists.txt
         | - foo.h.in

我想在include foo.hlibbench_main.a

// project/bench/bench_main.cc
#include "foo.h"
...

// project/bench/foo.h.in
#cmakedefine01 BAR

据我所知,预期的结果是,如果我在构建后在libbench_main.a上执行nm,则应该看到BAR符号。

就我而言,CMake似乎也很简单:

// project/bench/CMakeLists.txt
...
set(BAR FALSE)
configure_file(foo.h.in foo.h @ONLY)
add_library(bench_main STATIC bench_main.cc foo.h)
target_include_directories(bench_main PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
...

对吗?因此,我配置了文件,然后在cmake -GNinja ..中运行project/build之后,我得到了:

// project/build/bench/foo.h
#define BAR 0

一切都如预期。但是,当我在ninja bench/libbench_main.a中运行project/build并进行实际构建时,没有任何错误,但是nm-ing project/build/bench/libbench_main.a显示该符号不存在。我不知道这样一个简单的命令集怎么可能无法包含它-在CMake中很明显,它是要添加的。我应该添加一个干净的build目录,所以这不会成为问题。

如果有任何区别,可以在Ubuntu上使用CMake 3.12版。

1 个答案:

答案 0 :(得分:1)

#define BAR 0是C预处理程序指令,因此未定义任何符号。您需要显式使用此定义。例如:const extern bool bar(BAR);中的bench_main.cc。如果将foo.h.in中的行更改为bool bar = @BAR@;,也可以直接在CMakeLists.txt中将其定义为set(BAR false)(小写的false)。在使用全局变量时只需记住ODR

也无需在add_library(bench_main STATIC bench_main.cc)中包含标头