CMake файл_конфигурации не включен в статическую библиотеку - PullRequest
1 голос
/ 18 апреля 2019

Структура каталогов выглядит следующим образом:

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.

1 Ответ

1 голос
/ 18 апреля 2019

#define BAR 0 является директивой препроцессора C и поэтому не определяет никаких символов.Вам нужно явно использовать это определение.Например: const extern bool bar(BAR); в вашем bench_main.cc.Он также может быть определен непосредственно в foo.h.in как bool bar = @BAR@;, если вы измените свою строку в CMakeLists.txt на set(BAR false) (строчная ложь).Просто помните о ODR при игре с глобальными переменными.

Также нет необходимости включать ваш заголовок в add_library(bench_main STATIC bench_main.cc)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...