Общая библиотека не найдена - не в разделе NEEDED, а косвенная зависимость [дубликат]

== тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).

.equals() тесты для равенства значений (независимо от того, являются ли они логически «равными»).

Objects.equals () проверяет наличие null перед вызовом .equals(), поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).

String.contentEquals () сравнивает содержимое String с содержимым любого CharSequence (доступно с Java 1.5).

Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals().

// These two have the same value
new String("test").equals("test") // --> true 

// ... but they are not the same object
new String("test") == "test" // --> false 

// ... neither are these
new String("test") == new String("test") // --> false 

// ... but these are because literals are interned by 
// the compiler and thus refer to the same object
"test" == "test" // --> true 

// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true

// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true

Вы почти всегда хотите использовать Objects.equals(). В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==.

Из JLS 3.10. 5. Строковые литералы :

Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса String. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя метод String.intern.

. Подобные примеры также можно найти в JLS 3.10.5-1 .

3
задан Kun Ren 5 November 2017 в 03:04
поделиться

1 ответ

Кажется, что -Wl, -rpath здесь не эффективен.

Вероятно, что ваш обновленный компоновщик испускает динамический тег DT_RUNPATH, в котором исходит старый компоновщик DT_RPATH. (Возможно также, что ваш старый компоновщик был GNU-ld, а новый - Gold.)

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

DT_RPATH имеет глобальный эффект, подобно добавлению каталога в переменную среды LD_LIBRARY_PATH.

Вы можете проверить это с помощью: readelf -d a.out | grep 'R.*PATH'.

Если вы видите разницу RPATH против RUNPATH и фактически используете Gold, вы можете заставить «старое» поведение с -Wl,--disable-new-dtags (GNU ld также --disable-new-dtags добавлен к нему недавно, поэтому он должен работать для любого линкера).

5
ответ дан Employed Russian 16 August 2018 в 03:34
поделиться
  • 1
    Да, RUNPATH вместо RPATH появляется в ELF. В моем случае, RPATH - это то, что мне нужно. – Kun Ren 12 November 2017 в 01:13
  • 2
    Похоже, что поведение по умолчанию ld, поставляемое с Ubuntu 16.04, отличается от поведения с Ubuntu 17.10. Я смотрю на оба места, на которые указывает /usr/bin/ld, оба указывают на x86_64-linux-gnu-ld, но с другой версией. Это один GNU-ld и другой Gold или просто разрыв версии? – Kun Ren 12 November 2017 в 04:37
  • 3
    @KunRen У меня нет доступа к 16.04 из 17.10. Вы можете запустить ld --version. GNU-ld будет выглядеть так: GNU ld (GNU Binutils for Ubuntu) .... Золото будет выглядеть так: GNU gold (GNU Binutils for Ubuntu ...) – Employed Russian 12 November 2017 в 04:47
  • 4
    Ubuntu 16.04: GNU ld (GNU Binutils для Ubuntu) 2.26.1 Ubuntu 17.10: GNU ld (GNU Binutils для Ubuntu) 2.29.1 – Kun Ren 12 November 2017 в 04:49
  • 5
    – Steve Lorimer 12 December 2017 в 16:15
  • 6
    @SteveLorimer Да: идея заключается в том, что каждое изображение ELF должно быть построено для правильного описания его собственных требуемых путей выполнения и собственных зависимостей, а не в зависимости от того, какая «основная» приложение загружается в. Способ RUNPATH для каждой из транзитивных зависимостей является способом достижения этого. – Employed Russian 12 December 2017 в 16:24
  • 7
    – Employed Russian 23 August 2018 в 14:20
Другие вопросы по тегам:

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