Структура каталогов выглядит следующим образом:
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 также кажется мне довольно простым, насколько 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.