CMake configure_file未包含在静态库中

丹尼尔·索塔(Daniel Soutar)

目录结构如下:

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

因此,据我所知,预期的结果是,如果nm在构建后在libbench_main.a上执行该操作,则应该看到该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.aproject/build实际上建造这个,有没有错误,但nm-ingproject/build/bench/libbench_main.a显示,符号是不存在的。知道这么简单的命令集怎么可能无法包含它-在CMake中很明显,它是要添加的。build我应该添加一个干净的目录,这样就不会有问题了。

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

pptaszni

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

同样也不需要在其中包含标题 add_library(bench_main STATIC bench_main.cc)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章