Что может связать с целью воздействия CMake? - PullRequest
0 голосов
/ 18 января 2019

Я столкнулся с интересной проблемой сегодня. Я пытаюсь скомпилировать и связать исполняемый файл теста с платформой модульного тестирования Boost, и я попробовал его двумя различными способами.

  1. Классический подход прямого соединения с библиотекой boost_unit_test_framework с использованием -lboost_unit_test_framework
  2. Современный подход к связыванию CMake с целью Boost::unit_test_framework CMake.

Интересно, что когда я напрямую ссылаюсь на библиотеку, мой код компилируется и ссылки нормально работают; однако, когда я связываюсь с целью CMake, мой код не компилируется, даже не доходя до стадии компоновки!

Ошибки, которые я получаю, связаны с заголовочным файлом, который, кажется, больше не может найти. Это говорит о том, что ссылка на Boost::unit_test_framework как-то перепутана с моим путём включения.

Я знаю, что связывание с целью CMake должно быть более современным и предпочтительным подходом, но если у него могут быть такие неожиданные и необъяснимые побочные эффекты, это кажется хуже, чем просто прямая ссылка на библиотеку ...

Почему при связывании цели CMake файлы заголовков больше не будут найдены? Также какие другие виды вещей могут ссылаться на цель CMake вместо прямой ссылки на библиотечное влияние?


В обоих случаях я использую target_link_libraries для ссылки на библиотеку наддува. Например

target_link_libraries(mytest_exe
    testlib
    -lboost_unit_test_framework
)

или

target_link_libraries(mytest_exe
    testlib
    Boost::unit_test_framework
)

1 Ответ

0 голосов
/ 18 января 2019

Тот факт, что перед связыванием происходит сбой, означает, что команда target_link_libraries в CMake фактически влияет не только на связывание.Это также влияет на компиляцию.

Да, это правда, что новые включаемые каталоги добавляются при связывании с библиотекой target вместо библиотеки file .Вот почему этот подход называется «современный» - один вызов target_link_libraries делает все, что нужно для использования библиотеки (в вашем случае Boost).

Причиной отказа при «современном» подходе может бытьчто «истинные» заголовки Boost конфликтуют с другими заголовками, которые вы используете.Вы можете обнаружить это с помощью проверки цепочки включаемых файлов в сообщении об ошибке.

...