Невозможно объединить dex из-за нескольких файлов dex, определить Ljavax / json / Json; [Дубликат]

Когда ваши пути include разные

Ошибки компоновщика могут произойти, если заголовочный файл и связанная с ним общая библиотека (файл .lib) не синхронизируются. Позволь мне объяснить.

Как работают линкеры? Линкер соответствует объявлению функции (объявленному в заголовке) с его определением (в общей библиотеке) путем сравнения их подписи. Вы можете получить ошибку компоновщика, если компоновщик не найдет определение функции, которое идеально подходит.

Возможно ли получить ошибку компоновщика, даже если объявление и определение, похоже, совпадают? Да! Они могут выглядеть одинаково в исходном коде, но это действительно зависит от того, что видит компилятор. По сути, вы можете столкнуться с такой ситуацией:

// header1.h
typedef int Number;
void foo(Number);

// header2.h
typedef float Number;
void foo(Number); // this only looks the same lexically

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

Вы можете спросить, как это получается в такой ситуации? Включите пути, конечно! Если при компиляции разделяемой библиотеки путь include приводит к header1.h, и вы в конечном итоге используете header2.h в своей собственной программе, вы оставите царапины на своем заголовке, задаваясь вопросом, что произошло (каламбур).

Пример того, как это может произойти в реальном мире, объясняется ниже.

Дальнейшая разработка с примером

У меня есть два проекта: graphics.lib и main.exe. Оба проекта зависят от common_math.h. Предположим, что библиотека экспортирует следующую функцию:

// graphics.lib    
#include "common_math.h" 

void draw(vec3 p) { ... } // vec3 comes from common_math.h

И затем вы идете вперед и включаете библиотеку в свой собственный проект.

// main.exe
#include "other/common_math.h"
#include "graphics.h"

int main() {
    draw(...);
}

Boom! Вы получаете ошибку компоновщика, и вы понятия не имеете, почему она терпит неудачу. Причина в том, что общая библиотека использует разные версии одного и того же include common_math.h (я сделал это очевидным здесь в этом примере, включив другой путь, но это может быть не всегда так очевидно. Возможно, путь include отличается в настройки компилятора).

Обратите внимание, что в этом примере компоновщик сказал бы вам, что не смог найти draw(), когда на самом деле вы знаете, что он явно экспортируется библиотекой. Вы могли часами царапать себе голову, думая, что пошло не так. Дело в том, что компоновщик видит другую подпись, потому что типы параметров немного отличаются. В этом примере vec3 является другим типом в обоих проектах в отношении компилятора. Это может произойти из-за того, что они происходят из двух немного разных файлов include (возможно, включенные файлы поступают из двух разных версий библиотеки).

Отладка компоновщика

DUMPBIN - ваш друг, если вы используете Visual Studio. Я уверен, что другие компиляторы имеют другие подобные инструменты.

Процесс выглядит следующим образом:

  1. Обратите внимание на странное искаженное имя, указанное в ошибке компоновщика. (например, draw @ graphics @ XYZ).
  2. Выгрузите экспортированные символы из библиотеки в текстовый файл.
  3. Найдите экспортированный символ, представляющий интерес, и обратите внимание, что искаженное имя
  4. Обратите внимание на то, почему искаженные имена оказались разными. Вы могли бы видеть, что типы параметров различны, хотя они выглядят одинаково в исходном коде.
  5. Причина, почему они разные. В приведенном выше примере они различаются из-за разных файлов include.

[1] По проекту я имею в виду набор исходных файлов, которые связаны друг с другом для создания либо библиотеки, либо исполняемого файла .

РЕДАКТИРОВАТЬ 1: Переписать первый раздел, который будет легче понять. Пожалуйста, прокомментируйте ниже, чтобы сообщить мне, нужно ли что-то еще исправлять. Спасибо!

195
задан CommonsWare 13 January 2014 в 21:08
поделиться

23 ответа

Запустите gradle -q dependencies (или gradle -q :projectName:dependencies), чтобы создать отчет о зависимости. Вы должны увидеть, откуда r7, например:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    |    \--- com.google.android:support-v4:r7
|    +--- com.commonsware.cwac:camera:0.5.4
|    \--- com.android.support:support-v4:18.0.+ -> 18.0.0
\--- com.android.support:support-v4:18.0.+ -> 18.0.0

Затем используйте директиву exclude для блокировки этой зависимости. В моем случае это происходит из моей библиотеки CWAC-Camera, поэтому я использую:

dependencies {
    compile('com.commonsware.cwac:camera-v9:0.5.4') {
      exclude module: 'support-v4'
    }

    compile 'com.android.support:support-v4:18.0.+'
}

(где второй оператор compile указывает, какую версию вы действительно хотите)

Это должно устранить проблему, поскольку вы увидите, что вы снова запустите отчет о зависимости:

compile - Classpath for compiling the main sources.
+--- com.commonsware.cwac:camera-v9:0.5.4
|    +--- com.actionbarsherlock:actionbarsherlock:4.4.0
|    \--- com.commonsware.cwac:camera:0.5.4
\--- com.android.support:support-v4:18.0.+ -> 18.0.0
290
ответ дан CommonsWare 23 August 2018 в 22:12
поделиться

Я удалил compile 'com.android.support:support-v4:18.0.+' в зависимостях, и он работает

1
ответ дан albert 23 August 2018 в 22:12
поделиться

Это раздражающая проблема, которая может занять некоторое время, чтобы выяснить корневой регистр. Способ, которым вы должны продолжить, - ответить @CommonsWare.

Недавно я столкнулся с этой проблемой, и мне было трудно ее решить.

Моя проблема заключалась в том, что я включил библиотеку в версию «+» в build.gradle. Последняя версия библиотеки содержала один из старых dex и bang.

Я вернулся к старой версии библиотеки и решил ее.

Хорошо запускать ваши androidDependencies и посмотреть, что на самом деле происходит , Его также хорошо искать в вашей папке сборки.

Прежде всего, Android Studio 2.2 предоставляет встроенные функции для отслеживания этой проблемы.

Счастливые ребята-кодировщики

2
ответ дан Arun C 23 August 2018 в 22:12
поделиться

У меня была такая же ошибка, но это произошло потому, что я недавно изменил использование v4 в v13. Так что все, что мне нужно было сделать, - это очистить проект.

6
ответ дан ashishduh 23 August 2018 в 22:12
поделиться

Я использую com.google.android.gms:play-services-analytics:8.3.0 и android-support-v13.jar и не могу заставить exclude module: 'support-v4' работать.

Что сработало для меня, это использовать артефакт android-support-v13, а не файл android-support-v13.jar.

Т.е. вместо

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile files('libs/android-support-v13.jar')

}

Я использовал

dependencies {
compile ('com.google.android.gms:play-services-analytics:8.3.0')
compile ('com.google.android:android-support-v13')

}

2
ответ дан barry 23 August 2018 в 22:12
поделиться

Получил работу для конфликта compile file('...'), увеличив minSdkVersion до 21 и включив multidex. Не уверен, что это лучшее решение, но единственный способ заставить его работать в моем случае.

Примечание: для compile file('...') кажется, что вы не можете поместить в exclude предложение, чтобы опция была недоступно.

0
ответ дан Ben Kleywegt 23 August 2018 в 22:12
поделиться

В случае, если кто-нибудь узнает, что ответ из CommonsWare не может быть применен к проекту библиотеки андроида, вот фрагмент, который нужно исправить

compile (project (': yourAndroidLibrary' )) {exclude module: 'support-v13'}

Вы найдете проблемы

Неподдерживаемый метод DSL-меток найден: 'exclude ()'

, если вы используете проект компиляции (': yourAndroidLibrary') {exclude module: 'support-v13'}

Различия - это браслет «(» и «)» перед «проектом».

9
ответ дан Community 23 August 2018 в 22:12
поделиться

В Android Studio перейдите в свой build.gradle (проверьте как файлы проекта, так и модули build.gradle) и найдите дубликаты зависимостей.

Удалить те, которые не нужны вашему проекту.

5
ответ дан cricket_007 23 August 2018 в 22:12
поделиться

Я решил все свои проблемы, добавив это в project.properties

cordova.system.library.7=com.android.support:appcompat-v7:27.1.0
0
ответ дан eatmeimadanish 23 August 2018 в 22:12
поделиться

Также обратите внимание, что вы можете видеть свои зависимости от Android, перейдя в режим просмотра Android Studio Gradle и выбрав целевые «androidDependencies».

Еще один совет: у меня была эта проблема, пока я не удалил v4-поддержку lib из папки libs как в проекте, так и в связанных с ним проектах модуля / библиотеки.

33
ответ дан edsappfactory.com 23 August 2018 в 22:12
поделиться

У меня была такая же проблема, и, похоже, у моего приложения было слишком много методов из-за библиотек: http://developer.android.com/tools/building/multidex.html

Решил его с помощью:

android {
   defaultConfig {
   ...
   multiDexEnabled = true
   }
}

Подробнее здесь Ошибка: выполнение выполнено для задачи ': app: dexDebug'. & GT; comcommand завершена с ненулевым значением выхода 2

8
ответ дан Giannis P 23 August 2018 в 22:12
поделиться

У меня была такая же проблема. В моем проекте у меня были следующие зависимости:

  • appcompat-v7
  • android-support-v13

По старым причинам, appcompat был получен из репозитория Google Maven, тогда как поддержка android была локальной .jar.

Когда я понял это и заменил эту локальную ссылку ссылкой на maven, она просто решила мою проблему сборки .

Вот мой способ: app / build.gradle:

0
ответ дан kall2sollies 23 August 2018 в 22:12
поделиться

У меня была такая же проблема при добавлении react-native-palette в мой проект, вот мое дерево зависимостей:

./gradlew app:dependencies
+--- project :react-native-palette
|    +--- com.facebook.react:react-native:0.20.+ -> 0.44.2
|    |    +--- javax.inject:javax.inject:1
|    |    +--- com.android.support:appcompat-v7:23.0.1
|    |    |    \--- com.android.support:support-v4:23.0.1
|    |    |         \--- com.android.support:support-annotations:23.0.1 -> 24.2.1
...
|    \--- com.android.support:palette-v7:24.+ -> 24.2.1
|         +--- com.android.support:support-compat:24.2.1
|         |    \--- com.android.support:support-annotations:24.2.1
|         \--- com.android.support:support-core-utils:24.2.1
|              \--- com.android.support:support-compat:24.2.1 (*)
+--- com.android.support:appcompat-v7:23.0.1 (*)
\--- com.facebook.react:react-native:+ -> 0.44.2 (*)

Я пробовал много сотонов и не мог исправить его, пока не изменил версию com.android.support:appcompat в android/app/build.gradle, я бы хотел, чтобы это помогло:

dependencies {
    compile project(':react-native-palette')
    compile project(':react-native-image-picker')
    compile project(':react-native-camera')
    compile fileTree(dir: "libs", include: ["*.jar"])
    // compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.android.support:appcompat-v7:24.2.1"
    compile "com.facebook.react:react-native:+"
}

кажется, что несколько записей не являются большой проблемой, несоответствие версии -

0
ответ дан matrixer 23 August 2018 в 22:12
поделиться

У меня была та же проблема, и мое решение меняет версию поддержки '27. + '(27.1.0) на '27 .0.1'

0
ответ дан Mingyong Gu 23 August 2018 в 22:12
поделиться

Если вы импортировали проект из Eclipse.

1. The select project 
2. Go to File -> **Project Structure**
3. Select app in **module** section on left hand panel
4. Select **Dependency** tab
5. Your able to see jars you have added in eclipse project for v4 and v13.
6. Remove that jar by clicking on minus sign at bottom after selection
7. Click on Plus sign select **Library Dependency** 
8. Choose V4 and V13 if added
9. Press Ok and Clean and Rebuild your project

Сценарий, с которым я столкнулся после импорта проекта Eclipse в студию Android.

Надеюсь, это поможет ..

2
ответ дан MobileEvangelist 23 August 2018 в 22:12
поделиться

Так как картинка стоит тысячи слов

Чтобы было проще и быстрее выполнять эту задачу с новичками, такими как я. это скриншоты, которые показывают ответ, отправленный @ edsappfactory.com, который работал для меня:

Сначала откройте представление Gradle в правой части Androidstudio, в пункте вашего приложения перейдите к Tasks, затем Android затем щелкните правой кнопкой мыши androidDependencies, затем выберите Run:

Во-вторых, вы увидите что-то вроде этого:

Основная причина, по которой я опубликовал это, было непросто узнать, где выполнить задачу gradle или команды, описанные выше. Таким образом, это также должно исправить их.

SO, чтобы выполнить команду градиента:

Сначала:

Второе:

Легко, как есть.

Thats it.

Спасибо.

27
ответ дан Nicolas Raoul 23 August 2018 в 22:12
поделиться
exclude module: 'support-v4'

Не будет работать для меня с зависимостями проекта, единственный способ заставить его работать с помощью следующего синтаксиса:

configurations {
    dependencies {
        compile(project(':Android-SDK')) {
            compile.exclude module: 'support-v4'
        }
    }
}

Где: Android-SDK - это название вашего проекта .

7
ответ дан Pellet 23 August 2018 в 22:12
поделиться

Получена следующая ошибка

Выполнение не выполнено для задачи ': app: transformDexArchiveWithDexMergerForDebug'.

com.android.build.api.transform.TransformException: com.android .dex.DexException: несколько файлов dex определяют Landroid / support / constraint / ConstraintSet $ ​​1

Исправить: перейти к сборке -> Очистить проект

0
ответ дан Ragunath CR 23 August 2018 в 22:12
поделиться

Я решил аналогичную ошибку, добавив следующий фрагмент кода в файл build.gradle внутри блока android.

android {
    dexOptions {
        preDexLibraries = false
    }
}
119
ответ дан Sebas Hollow 23 August 2018 в 22:12
поделиться

Я начал получать эту ошибку при обновлении до ButterKnife 8.5.1. Ни один из других ответов здесь не работал для меня.

Я использовал gradle -q :app:dependencies, чтобы увидеть дерево, а затем просмотрел файлы jar, пока не нашел конфликт. Конфликт заключался в том, что зависимость butterknife от com.android.support:support-compat:25.1.0 содержит версию класса доступности, а com.android.support:support-v4:23.1.1 также содержит класс.

Я решил его, изменив свою зависимость от этого:

compile 'com.jakewharton:butterknife:8.5.1'

к этому:

compile('com.jakewharton:butterknife:8.5.1') {
    exclude module: 'support-compat'
}

До сих пор это не повлияло на работу ButterKnife.

Изменить: есть лучшее решение, которое должно было обновить мой Android поддержка библиотек для соответствия ButterKnife's:

compile('com.android.support:appcompat-v7:25.2.0')
compile('com.android.support:design:25.2.0')
compile 'com.jakewharton:butterknife:8.5.1'
9
ответ дан user3562927 23 August 2018 в 22:12
поделиться

Наконец, я решил, что он модифицирует эти атрибуты в файле градиента модуля

  1. compileSdkVersion 25
  2. targetSdkVersion 25
  3. compile 'com.android. support: appcompat-v7: + '
  4. compile' com.android.support:recyclerview-v7:+'
0
ответ дан Val Martinez 23 August 2018 в 22:12
поделиться

В моем случае проблема была вызвана несогласованностью версии:

Build tools 25
compileSdk 24
targetSdk 24
Support library 24

Решение было простым: сделать все версии 25

3
ответ дан WindRider 23 August 2018 в 22:12
поделиться

Удаление всех файлов из кеша Gradle устраняет мою проблему.

в Linux:

cd ~/.gradle  
rm -R -f *
2
ответ дан Yuliia Ashomok 23 August 2018 в 22:12
поделиться
Другие вопросы по тегам:

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