CMake configure_file不包含在静态库中

CMake configure_file not being included in static library

本文关键字:静态 包含 configure file CMake      更新时间:2023-10-16

目录结构如下:

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.h libbench_main.a

// project/bench/bench_main.cc
#include "foo.h"
...
// project/bench/foo.h.in
#cmakedefine01 BAR
因此,据我

了解,预期的结果是,如果我在构建libbench_main.a后对其进行nm,我应该看到BAR符号。

就CMake

而言,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

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

这是在 Ubuntu 上,如果这有任何区别,CMake 版本 3.12。

#define BAR 0是一个

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

此外,无需在add_library(bench_main STATIC bench_main.cc)中包含标题