Как создать общий объект, который статически связан с pthreads и libstdc ++ на Linux/gcc?

При публикации в будущем укажите полную ошибку, с которой вы столкнулись. Он содержит полезную информацию, такую ​​как номера строк.

Я вижу, что либо

this.state.posts, либо res.data.data.children

Должно возвращаться значение NULL, чтобы эта ошибка произошла, поскольку у них обоих вызывается функция map им.

this.state.posts определенно является множественным, в то время как состояние определяется с помощью формы единственного числа:

this.state = {
  post:[],
  subr:'space'
};

Таким образом, переименование его во множественную версию может исправить ошибку, которую вы описали

this.state = {
  posts:[],
  subr:'space'
};
5
задан 14 February 2009 в 10:05
поделиться

3 ответа

Я думаю, что этот парень объясняет вполне хорошо, почему это не имело бы смысла. Код C++, который использует Ваш общий объект, но другой libstdc ++ связался бы хорошо, но не будет работать.

0
ответ дан 14 December 2019 в 01:19
поделиться

Прежде чем я перейду к ответу на Ваш вопрос, как он был описан, я отмечу, что не точно ясно, чего Вы пытаетесь достигнуть в конце, и существует, вероятно, лучшее решение Вашей проблемы.

Это сказало - существует две основных проблемы с попыткой сделать то, что Вы описали:

  1. Каждый, который необходимо будет анализировать libpthread и libstdc++ к объектным файлам они сделаны с. Это вызвано тем, что двоичные файлы ELF (используемый на Linux) имеют два уровня загрузки библиотеки "времени выполнения" - даже когда исполняемый файл статически связан, загрузчик должен загрузить статически связанные библиотеки в двоичном файле на выполнении и отобразить правильные адреса памяти. Это сделано перед общей связью библиотек, которые динамично загружаются (общие объекты) и отображаются на общей памяти. Таким образом общий объект не может быть статически связан с такими библиотеками, как, в то время, когда объект загружается, все статические связанные библиотеки уже были загружены. Это - одно различие между соединением со статической библиотекой и файлом простого объекта - статическая библиотека просто не склеивается как никакой объектный файл в исполняемый файл, но все еще содержит отдельные таблицы, которые упомянуты на загрузке. (Я полагаю, что это в отличие от намного более простых статических библиотек в MS-DOS и классическом Windows, .LIB файлы, но может быть больше в файлы, чем я помню).

    Конечно, Вы не должны на самом деле разлагаться libpthread и libstdc++, можно просто использовать объектные файлы, сгенерированные при создании их. Сбор их может быть немного трудным хотя (ищут объекты, упомянутые заключительным правилом Make-файла тех библиотек). И необходимо было бы использовать ld непосредственно и нет gcc/g++ связать, постараться не связываться с динамическими версиями также.

  2. Вторая проблема последовательна. Если Вы сделаете вышеупомянутое, то Вы будете уверенный иметь такой общий объект / динамическая библиотека, когда Вы попросили создавать. Однако это не будет очень полезно, как, после того как Вы пытаетесь связать регулярный исполняемый файл, который использует их libpthread/libstdc++ (последнее существо любая программа C++) с этим общим объектом, это перестанет работать с конфликтами символа - символы помех libpthread/libstdc++ объекты, против которых Вы связали свой общий объект, столкнутся с символами из стандарта libpthread/libstdc++ используемый тем исполняемым файлом, неважно, если это динамично или статически связано со стандартными библиотеками.

    Вы могли, конечно, затем попробовать любому, скрывают все символы в статических объектах от libstdc++/libpthread используемый Вашей общей библиотекой, сделайте их частными в некотором роде или переименуйте их автоматически на связи так, чтобы не было никакого конфликта. Однако, даже если Вы заставите это работать, то Вы найдете некоторые нежелательные результаты во времени выполнения, начиная с обоих libstdc++/libpthread сохраните довольно мало состояния в глобальных переменных и структурах, которые у Вас теперь были бы дубликат и каждый не знающий о другом. Это приведет к несоответствиям между этими глобальными данными и базовым состоянием операционной системы, такими как дескрипторы файлов и границы памяти (и возможно некоторые значения от стандартной библиотеки для C такой как errno для libstdc++, и обработчики сигналов и таймеры для libpthread.

Для предотвращения сверхширокого толкования я добавлю комментарий: время от времени могут быть разумные основания для желания статически связаться даже против таких основных библиотек как libstdc++ и даже libc, и даже при том, что это становится немного более трудным с недавними системами и версиями тех библиотек (из-за небольшого количества связи с загрузчиком и специальными используемыми приемами компоновщика), это определенно возможно - я сделал это несколько раз и знаю о других случаях, в которых это все еще сделано. Однако в этом случае необходимо связать целый исполняемый файл статически. Статическая связь со стандартными библиотеками, объединенными с динамической связью с другими объектами, не обычно выполнима.


Править: Одной проблемой, которую я забыл упоминать, но важен для принятия во внимание, является конкретный C++. C++ не был, к сожалению, разработан для работы хорошо с классической моделью объектной связи и загружающийся (используемый на Unix и других системах). Это делает совместно использованные библиотеки в C++ не действительно портативными, как они должны быть, потому что много вещей, таких как информация о типе и шаблоны чисто не разделяется между объектами (часто быть взятым, вместе с большим количеством фактического кода библиотеки во время компиляции от заголовков). libstdc++ по этой причине сильно связывается с GCC и кодом, скомпилированным с одной версией g++ будет в общем только работать с libstdc++ от с этим (или очень похожее) версия g++. Как Вы, конечно, заметите, пытаетесь ли Вы когда-нибудь создать программу с GCC 4 с какой-либо нетривиальной библиотекой по Вашей системе, которая была создана с GCC 3, это не просто libstdc++. Если Ваша причина желания сделать, который пытается гарантировать, что Ваш общий объект всегда связывается с определенными версиями libstdc++ и libpthread то, что это было создано против, это не поможет, потому что программа, которая использует различное/несовместимое libstdc++ был бы также создан с несовместимым компилятором C++ или версией g++, и таким образом не удался бы связаться с Вашим общим объектом так или иначе, кроме фактического libstdc++ конфликты.

Если Вы задаетесь вопросом, "почему это не было сделано более простое?", общее размышление, которое стоит обдумать: Чтобы C++ работал приятно с динамическими/общими библиотеками (значение совместимости через компиляторы и способности заменить динамическую библиотеку другой версией с совместимым интерфейсом, не восстанавливая все, что использует его), не только, компилятор standartization необходим, но и на уровне загрузчика операционной системы, структуры и интерфейса объекта и файлов библиотеки, и работа компоновщика должна была бы быть значительно расширена вне относительно простой классики Unix, используемой в общих операционных системах (Microsoft Windows, основанные на Махе системы и родственники NeXTStep, такие как Mac OS, родственники VMS и некоторые мейнфреймовые системы, также включенные) для исходно созданного кода сегодня. Компоновщик и динамический загрузчик должны были бы знать о таких вещах как шаблоны и ввод, имея в некоторой степени функциональность маленького компилятора для фактической адаптации кода библиотеки к типу, данному ему - и (персональное субъективное наблюдение здесь) кажется, что высокоуровневый промежуточный промежуточный код (вместе с высокоуровневыми языками и своевременной компиляцией) ловит землю быстрее и вероятно быть стандартизированным раньше, чем такие расширения собственных объектных форматов и компоновщиков.

8
ответ дан 14 December 2019 в 01:19
поделиться

Вы упомянули в отдельном комментарии, что Вы пытаетесь портировать библиотеку C++ на встроенное устройство. (Я добавляю новый ответ здесь вместо того, чтобы редактировать мой исходный ответ здесь, потому что я думаю, что другие пользователи StackOverflow, заинтересованные этим исходным вопросом, могут все еще интересоваться тем ответом в его контексте),

  • Очевидно, в зависимости от того, насколько разделенный вниз Ваша встроенная система (я не очень встроил опыт Linux, таким образом, я не уверен, что наиболее вероятно), можно, конечно, смочь просто установить общее libstdc++ на нем и динамично связывают все, как Вы сделали бы иначе.

  • При динамичном соединении с libstdc++ не было бы хорошо для Вас или не работы над Вашей системой (существует столько разных уровней встроенных систем, которые нельзя знать), и необходимо связаться против помех libstdc++, затем как я сказал, Ваша единственная реальная опция является статическим подключением исполняемый файл, пользующийся библиотекой с ним и libstdc++. Вы упомянули, что портировали библиотеку на встроенное устройство, но если это в целях использования его в некотором коде, Вы пишете или основываетесь на устройстве, и Вы не возражаете против помех libstdc++, затем связывая все статически (кроме, возможно, libc), вероятно, в порядке.

  • Если размер libstdc++ проблема, и Вы находите, что Ваша библиотека на самом деле только использует небольшую часть своих интерфейсов, затем я, тем не менее, предложил бы сначала пытаться определить фактическое свободное место, которое Вы оставите путем соединения только против частей, в которых Вы нуждаетесь. Это может быть значительно или нет, я никогда не изучал это глубоко libstdc++ и я подозреваю, что это имеет много внутренних зависимостей, поэтому в то время как Вам, конечно, не нужны некоторые интерфейсы, Вы можете или не можете все еще зависеть от большой части его внутренностей - я не знаю и не попробовал, но это может удивить Вас. Можно понять, просто связав двоичный файл, пользующийся библиотекой против статической сборки его и libstdc++ (не упущение разделить двоичный файл, конечно), и сравнение размера получающегося исполняемого файла это с общим размером (stripплетеная корзинка) исполняемый файл, динамично связанный вместе с полным (stripплетеная корзинка) общие объекты библиотеки и libstdc++.

    Если Вы находите, что разница в размере является значительной, но не хотят статически связывать все, Вы пытаетесь уменьшить размер libstdc++ путем восстановления его без некоторых частей Вы знаете, что Вам не нужно (существует, настраивают разовые опции для некоторых частей его, и можно также попытаться удалить некоторые независимые объекты при заключительном создании libstdc++.so. Существуют некоторые инструменты для оптимизации размера библиотек - ищут сеть (я вспоминаю один из компании под названием MontaVista, но не вижу его на их веб-сайте теперь, существуют некоторые другие также).

Кроме простого выше, некоторые идеи и предложения для размышления:

Вы упомянули, что используете uClibc, который я никогда не играл со мной (мой опыт со встроенным программированием намного более примитивен, главным образом включая программирование блока для встроенного процессора и кросс-компиляцию с минимальными встроенными библиотеками). Я предполагаю, что Вы проверили это, и я знаю это uClibc предназначается, чтобы быть легкой, а скорее полной стандартной библиотекой для C, но не забывают, что код C++ едва независим на библиотеке C, и g++ и libstdc++ зависьте от некоторых тонких вещей (я помню проблемы с libc на некоторых собственных версиях Unix), таким образом, я не просто принял бы это g++ или GNU libstdc++ на самом деле работы с uClibc не пробуя - я не вспоминаю наблюдение, что это упомянуло в uClibc страницы.

Кроме того, если это - встроенная система, думайте о ее производительности, вычислите питание, полную сложность и синхронизацию/простоту/требования прочности. Учтите сложность, включенную, и думайте, является ли использование C++ и потоков соответствующим в Вашей встроенной системе, и если ничто иное в системе не использует их, стоит ли это представить для той библиотеки. Это может быть, не зная библиотеку или систему я не могу сказать (снова, при этом встроенные системы являются таким широким спектром в наше время).

И в этом случае также, просто быстрая ссылка я наткнулся на поиск uClibc - если Вы работаете над встроенной системой, с помощью uClibc, и хочу использовать код C++ на нем - смотрят на uClibc++. Я не знаю, сколько из стандартного C++ наполняет Вас потребность, и это уже поддерживает, и это, кажется, текущий проект, таким образом, не ясный, если это уже находится в состоянии, достаточно хорошем для Вас, но предполагая, что Ваша работа также разрабатывается все еще, это могла бы быть хорошая альтернатива GCC's libstdc++ для Вашей встроенной работы.

1
ответ дан 14 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: