1

Есть код на C, 1 файл main, который импортирует либу. Также есть либа, в которой 4 файла:

declaration.h, declaration.cc, lib.h, lib.cc

declaration.h, declaration.cc играют роль "прослойки", внутри declaration.h только описания методов, внутри 'extern C'.

Есть простой cmake:

set(CMAKE_EXE_LINKER_FLAGS "-lrt")

SET (SOURCES ./main.c )

INCLUDE_DIRECTORIES ( /lib/ # тут путь до declaration.h )

ADD_EXECUTABLE (test ${SOURCES}) TARGET_LINK_LIBRARIES (test lib)

Как только используется хоть 1 метод из либы, при сборки cmake-ом во время линковки вываливается куча ошибок формата undefined reference to std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&).

Как в данном случае подключить c++ библиотеку к коду на c?

R. Key
  • 306
  • 2
  • 1
    Я считаю, что вопрос следует переоткрыть. Данная проблема берет свое начало в CMake файле - main имеет расширение .c, соответственно CMake использует gcc и пытается скомпилировать С-шное приложение. Здесь нужно расширение файла поменять, либо вручную добавить в зависимости libstdc++/libc++. – isnullxbh Jul 01 '20 at 11:12
  • @isnullxbh, предлагает открыть вопрос, чтобы тут же закрыть его по другой причине? а смысл? – aleksandr barakin Jul 01 '20 at 11:32
  • @aleksandrbarakin, извините, по другой - это по какой? – isnullxbh Jul 01 '20 at 11:45
  • @isnullxbh, думаю, по этой: «Вопрос вызван проблемой, которая больше не воспроизводится, или опечаткой. Хотя похожие вопросы могут быть уместны на этом сайте, решение для этого вопроса вряд ли поможет будущим посетителям. Обычно можно избежать подобных вопросов написанием и исследованием минимальной программы для воспроизведения проблемы до публикации вопроса.» – aleksandr barakin Jul 01 '20 at 11:49
  • @aleksandrbarakin, я не настаиваю. Что касается минимальной программы - мне самому интересно, а что конкретно Вы предлагаете здесь воспроизводить? Допустим, я не понимаю, что такое линкер, как он работает и зачем нужен - у меня вылетает такая ошибка, и что непосредственно в программе я должен иследовать? – isnullxbh Jul 01 '20 at 11:56
  • @isnullxbh, я привёл текст той причины закрытия, которую считаю подходящей к причине ошибки (неправильное имя файла). «воспроизводить здесь» ничего не предлагаю. как не-программист, но достаточно опытный unix-maintainer, я бы при поиске ошибки в первую очередь посмотрел бы на лог сборки (если он обозримого размера), во вторую — на экспортируемые библиотекой символы. впрочем, и совет «написать минимальную программу для воспроизведения пробемы» выглядит (и в данном случае) вполне разумно. – aleksandr barakin Jul 01 '20 at 12:10
  • @aleksandrbarakin, в том то и дело, что Вы - опытный :) А то, что файл указан с расширением .c - это не ошибка, просто CMake ведет себя иначе, как если бы это был .cpp файл. Но это уже тонкости (для тех, кто с ним малознаком) CMake. Собственно поэтому я голосовал за переоткрытие, ТС перейдет по ссылке на уже заданный вопрос - а ответа там не найдется. В общем, если ему действительно это интересно, он наверное читает эти сообщения и догадается, что нужно сделать :) – isnullxbh Jul 01 '20 at 12:14
  • @isnullxbh . Благодарю, добавление libstdc++ решило проблему. – R. Key Jul 02 '20 at 08:23

1 Answers1

-1

Данная проблема берет свое начало в CMake файле - main имеет расширение .c, соответственно CMake использует gcc и пытается скомпилировать С-шное приложение. Здесь нужно расширение файла поменять, либо вручную добавить в зависимости libstdc++/libc++.

joker
  • 130