0

Мой код

#include "iostream"
#include "Utilities.cpp"
#include "boost/asio.hpp"

int main() { return 0; }

Пытаюсь его собрать через cmake

cmake_minimum_required(VERSION 3.1)
project(ProcessesManipulate)
set(CMAKE_CXX_STANDARD 20)

add_executable(ProcessesManipulate main.cpp)

Получаю ошибку

/usr/bin/ld: CMakeFiles/ProcessesManipulate.dir/main.cpp.o: in function `boost::asio::detail::posix_thread::~posix_thread()':
main.cpp:(.text._ZN5boost4asio6detail12posix_threadD2Ev[_ZN5boost4asio6detail12posix_threadD2Ev]+0x26): undefined reference to `pthread_detach'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Судя из ошибки, видно что линкер в бустовых библиотеках не может найти ссылку на pthread_detach. Почему так происходит? Я в коде подключаю заголовочный файл

#include "boost/asio.hpp" 

И получаю ошибку что где то там что то валится по не понятным причинам. Погуглив, я нашел пару вариантов. Добавив вот такой хак

find_package(Threads REQUIRED)
target_link_libraries(ProcessesManipulate PRIVATE Threads::Threads)

Все фиксится. Почему я должен знать что #include "boost/asio.hpp" внутри юзает pthread_detach. Когда я делаю #include "boost/asio.hpp" оно разве автоматом не должно мне подгрузить все зависимости?

  • Потому что в линукс обычно всё строится именно на pthreads – evo Feb 06 '22 at 17:28
  • 1
    "Когда я делаю #include "boost/asio.hpp" оно разве автоматом не должно мне подгрузить все зависимости" - конечно нет... ¿Первый день в С++? Тут надо линковать библиотеку pthread. "Почему я должен знать что #include "boost/asio.hpp" внутри юзает pthread_detach." - потому что так устроен С++, вам надо будет знать рекурсивно все зависимости интерфейса, указывать и контролировать их подключение вручную. – user7860670 Feb 06 '22 at 17:28
  • #include "iostream" Почему тогда эту библиотеку линковать не надо? – mazda3301 Feb 06 '22 at 17:28
  • 1
    iostream - это заголовочный файл стандартной библиотеки, вполне возможна ситуация, когда ее тоже надо будет явно линковать: когда компилятор собран без встроенной поддержки стандартной библиотеки или нужна статическая линковка или отличная от встроенной реализация – user7860670 Feb 06 '22 at 17:30
  • и например boost filesystem линковать не надо почему то... – mazda3301 Feb 06 '22 at 17:33
  • 1
    в boost часть библиотек являются заголовочными. читайте документацию... и какой-нибудь ликбез по стадиям сборки, работе препроцессора и линкера. – user7860670 Feb 06 '22 at 17:34
  • есть какой то способ что бы автоматизировать линковку? Допустим у меня огромный проект, с десятками библиотек, и что мне придется запускать проект и каждый раз смотреть какая либа не прилинковалась что бы её вручную линковать или что? – mazda3301 Feb 06 '22 at 20:50
  • 1
    Ну в общем да. Только обычно знать, какие либы надо линковать, надо еще до сборки. Для каждого символа надо знать, в каком файле он объявлен и в какой единице трансляции он определен. Автоматизации поддается только подставление соответствующих аргументов для линкера. На том же cmake можно написать минимальную систему сборки и простенькое управление зависимостями. – user7860670 Feb 06 '22 at 21:08
  • А можно мне ссылочку на материал что бы почитать про зависимости и про автоматизацию сборки? – mazda3301 Feb 06 '22 at 21:44

0 Answers0