I am trying to compile a C++ program like this:
However I get the following error:
I have no idea what this error means. Any help will be greatly appreciated.


1 Answer 1
DSO here means Dynamic Shared Object; since the error message says it’s missing from the command line, I guess you have to add it to the command line.
That is, try adding -lpthread to your command line.
когда я компилирую openvswitch-1.5.0, я столкнулся со следующей ошибкой компиляции:
Если я попытаюсь увидеть символы libpthread , это выглядит нормально.
не могли бы вы дать какие-либо подсказки или указатели?
10 ответов
вы должны упомянуть библиотеку в командной строке после объектные файлы, скомпилированные:
объяснение: связывание зависит от порядка следования модулей. Символы сначала запрашиваются, а затем связываются из библиотеки, в которой они есть. Поэтому сначала необходимо указать модули, использующие библиотеки,а затем библиотеки. Вот так:
кроме того, если есть круговая зависимость, вы должны указать ту же библиотеку на командная строка несколько раз. Так в случае libb нужен символ libc и libc нужен символ libb командная строка должна быть:
сообщение об ошибке зависит от дистрибутива / версии компилятора:
Ubuntu Raring: (более информативно)
устранение: на этапе компоновки может отсутствовать библиотека в шагах компиляции. В моем случае я добавил’ — lz ‘ к флагам makefile / GCC.
Справочная информация: DSO-это динамический общий объект или общая библиотека.
я нашел другой случай, и поэтому я думаю, что вы все ошибаетесь.
вот что у меня было:
проблема в том, что командная строка не содержит -lX11 — хотя libX11.поэтому следует добавить как зависимость, потому что в аргументах также были библиотеки GTK и GNOME.
Итак, единственное объяснение для меня заключается в том, что это сообщение могло быть предназначено для помочь, но он не сделал этого должным образом. Это было, вероятно, простой: библиотека, предоставляющая символ, не была добавлена в командную строку.
обратите внимание на три важных правила, касающиеся связи в POSIX:
- динамические библиотеки имеют определенные зависимости, поэтому только библиотеки из верхней зависимости должны быть предоставлены в любом порядке (хотя после статических библиотек)
- статические библиотеки имеют только неопределенные символы — это зависит от вас, чтобы узнать их зависимости и предоставить все из них в команде линия
- порядок static библиотеки всегда: истец впервые, провайдер следующее. В противном случае вы получите неопределенное символьное сообщение, как когда вы забыли добавить библиотеку в командную строку
- при указании библиотеки с -l , вы никогда не знаете, будет ли он принимать lib .so или lib .a . Динамическая библиотека предпочтительнее, если она найдена, а статические библиотеки могут применяться только с помощью опции компилятора — это все. И есть ли у вас какие-либо проблемы, как указано выше, это зависит от того, были ли у вас статические или динамические библиотеки
- ну, иногда зависимости могут отсутствовать в динамических библиотеках: D
Я обнаружил, что у меня была такая же ошибка. Я компиляции кода с lapack и Блас. Когда я переключил порядок вызова двух библиотек, ошибка исчезла.
» LAPACK_LIB = -llapack-lblas » работал там, где «LAPACK_LIB = -lblas-llapack» дал ошибку, описанную выше.
Я также столкнулся с той же проблемой. Не знаю почему, просто добавляю -lpthread опция компилятора и все в порядке.
получил следующее сообщение об ошибке. Если я добавлю -lpthread опция для команды выше, затем OK.
Я обнаружил, что иногда библиотека, на которую жалуется компоновщик, не является причиной проблемы. Возможно, есть умный способ выяснить, где проблема, но это то, что я делаю:
- прокомментируйте все связанные библиотеки в команде link.
- очистить все .o’s,.так и т. д. (Обычно достаточно очистить, но вы можете запустить рекурсивный find + rm или что-то подобное).
- раскомментируйте библиотеки по ссылке командуйте по одному и при необходимости меняйте порядок.
@peter karasev: я столкнулся с той же проблемой с проектом gcc 4.8.2 cmake на CentOS7. Порядок библиотек в разделе «target_link_libraries» важно. Я думаю, cmake просто передает список компоновщику как есть, т. е. он не пытается выработать правильный порядок. Это разумно — когда вы думаете об этом, cmake не может знать, что такое правильный порядок, пока соединение не будет успешно завершенный.
пожалуйста, добавьте: CFLAGS=»-lrt» и LDFLAGS=»-lrt»
то же самое произошло со мной, когда я устанавливал тест HPCC (включает HPL и несколько других тестов). Я добавил -lm к флагам компилятора в моем скрипте сборки, а затем он успешно скомпилирован.
та же проблема произошла со мной, когда я использую distcc сделать мой проект c++ ; Наконец, я решил это с export CXX=»distcc g++» .
при использовании g++ убедитесь, что вы не используете
Когда я компиляции openvswitch-1.5.0, я столкнулся со следующей компиляции ошибка:
Если я пытаюсь видеть символы libpthread , она выглядит хорошо.
Не могли бы вы дать какие-либо советы или указатели?
Следует отметить библиотеку в командной строке после того, как объектные файлы компилироваться:
Объяснение: связующая зависит от порядка модулей. Символы первой просьбе, а затем связаны с библиотекой, которая имеет их. Таким образом, вы должны указать модули, которые используют библиотеки первыми и библиотеки после них. Как это:
Кроме того, в случае , если есть циклическая зависимость, следует указать ту же библиотеку в несколько раз в командной строке. Таким образом , в случае libb потребности символ из libc и libc нуждается символ из libb , командная строка должна быть:
Сообщение об ошибке зависит от распределения версии / компилятора:
Ubuntu рвения: (более информативно)
Решение: Вы можете пропустить библиотеку в ваших шагах компиляции, во время связывающей стадии. В моем случае, я добавил «-lz» в Makefile / GCC флагов.
Предпосылки: ДСО представляет собой динамический общий объект или совместно используемую библиотеку.
Я нашел еще один случай, и поэтому я, что вы все неправильно.
Это то, что я имел:
Проблема заключается в том, что командная строка не содержит -lX11 — хотя libX11.so должны быть добавлены как зависимость , потому что там были также GTK и GNOME библиотеки аргументов.
Таким образом, единственное объяснение для меня является то , что это сообщение могло быть предназначено , чтобы помочь вам , но это не сделать это правильно. Вероятно , это было просто: библиотека , которая предоставляет символ не был добавлен в командной строке.
Обратите внимание на три важных правила, касающиеся связи в стандарте POSIX:
- Динамические библиотеки определена зависимость, поэтому только библиотеки из топ-зависимости должны быть поставлены в любом порядке (хотя после статических библиотек)
- Статические библиотеки имеют только неопределенные символы — это до вас, чтобы знать их зависимости и поставить их все в командной строке
- Порядок в статических библиотеках всегда: запрашивающий первый , поставщик следует . В противном случае вы получите сообщение неопределенного символа, как и когда вы забыли добавить библиотеку в командной строку
- При указании библиотеки с -l , вы никогда не знаете , будет ли он принимать lib .so или lib .a . Динамическая библиотека является предпочтительным, если он найден, и только статические библиотеки могут быть осуществлены с помощью опции компилятора — это все. И есть ли у вас какие — либо проблемы , как и выше, зависит от того, были ли статические или динамические библиотеки
- Ну, иногда зависимости могут отсутствовать в динамических библиотеках: D