React-native-code-push: [iOS] Duplicate symbols when using RNZipArchive in Cocoapods

Created on 18 Jul 2019  路  13Comments  路  Source: microsoft/react-native-code-push

If the project uses react-native-zip-archive and CodePush with Cocoapods, the SSZipArchive will have the duplicate issue.

duplicate symbol _fill_fopen_filefunc in:
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
    .../RNZipArchive/libRNZipArchive.a(ioapi.o)
duplicate symbol _fill_fopen64_filefunc in:
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
    .../RNZipArchive/libRNZipArchive.a(ioapi.o)
duplicate symbol _zipCloseFileInZipRaw in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetGlobalComment in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzSetOffset in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetOffset in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetFilePos in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGoToFilePos in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipWriteInFileInZip in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipCloseFileInZip in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetGlobalInfo in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetCurrentFileInfo in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpen in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipOpen in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unztell in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzClose in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipClose in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGoToNextFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGoToFirstFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpenCurrentFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzCloseCurrentFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzReadCurrentFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzLocateFile in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpenCurrentFilePassword in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetLocalExtrafield in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipCloseFileInZipRaw64 in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzSetOffset64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetOffset64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetFilePos64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGoToFilePos64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetGlobalInfo64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzGetCurrentFileInfo64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpen64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipOpen64 in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpen2_64 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipOpen2_64 in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpenCurrentFile3 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpen2 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _zipOpen2 in:
    .../RNZipArchive/libRNZipArchive.a(zip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)
duplicate symbol _unzOpenCurrentFile2 in:
    .../RNZipArchive/libRNZipArchive.a(unzip.o)
    .../SSZipArchive/libSSZipArchive.a(mz_compat.o)

I know there was a subset approach, that was removed, but there's no documentation how to work around it in a good way.

Most helpful comment

Still using 0.59... :/

All 13 comments

Assuming you're using RN 0.60 here, the easiest solution would probably be to disable auto linking for this library on iOS.

react-native.config.js

module.exports = {
    dependencies: {
        'react-native-code-push': {
            platforms: {
                ios: null,
            },
        },
    },
}

https://github.com/react-native-community/cli/blob/master/docs/autolinking.md#how-can-i-disable-autolinking-for-unsupported-library

Still using 0.59... :/

@sidferreira Have you fixed it? Same error here.

@FansPro Nop... I had to give up for now

This script fixed it for me:

echo "Modifying Codepush iOS HEADER_SEARCH_PATHS..."
sed -ie 's/\([[:space:]]HEADER_SEARCH_PATHS = (\)$/\1"$(SRCROOT)\/..\/..\/react-native-zip-archive",/g' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj

echo "Removing Codepush iOS zip sources..."
sed -ie '/\/\* SSZipArchive\.m in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* aescrypt\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* aeskey\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* aestab\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* entropy\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* fileenc\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* hmac\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* prng\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* pwd2key\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* sha1\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* ioapi\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* mztools\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* unzip\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj
sed -ie '/\/\* zip\.c in Sources \*\//d' ./node_modules/react-native-code-push/ios/CodePush.xcodeproj/project.pbxproj

echo "Successfully modified Codepush iOS project! This fixes this issue: https://github.com/microsoft/react-native-code-push/issues/1630"

You can add this to package.json as install script.

@SimonSimya it might work, but still far from an optimal solution

is there any good solution to fix this problem?
occurred error Duplicate symbols JWT & SSZipArchive

react-native: 0.60.5
react-native-code-push": 5.7.0
# react-native.config.js
module.exports = {
  project: {
    ios: {},
    android: {}
  },
  dependencies: {
    "react-native-code-push": {
      platforms: {
        android: null // disable autolink for android
      }
    }
  },
  assets: ["App/Fonts"]
}

Podfile

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'

require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules'

target 'MyApp' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  pod 'React', :path => '../node_modules/react-native/'
  pod 'React-Core', :path => '../node_modules/react-native/React'
  pod 'React-DevSupport', :path => '../node_modules/react-native/React'
  pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS'
  pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation'
  pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob'
  pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image'
  pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS'
  pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network'
  pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings'
  pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text'
  pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration'
  pod 'React-RCTWebSocket', :path => '../node_modules/react-native/Libraries/WebSocket'
  pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact'
  pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi'
  pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor'
  pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector'

  # Explicitly include Yoga if you are using RN >= 0.42.0
  pod 'yoga', :path => '../node_modules/react-native/ReactCommon/yoga'
  # Third party deps podspec link
  pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec'
  pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec'
  pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec'

  pod 'RNImageCropPicker', :path => '../node_modules/react-native-image-crop-picker'
  pod 'A0Auth0', :path => '../node_modules/react-native-auth0'
  pod 'RNGestureHandler', :path => '../node_modules/react-native-gesture-handler'
  pod 'RNScreens', :path => '../node_modules/react-native-screens'
  pod 'react-native-camera', path: '../node_modules/react-native-camera'
  pod 'BVLinearGradient', :path => '../node_modules/react-native-linear-gradient'
  pod 'RNReanimated', :path => '../node_modules/react-native-reanimated'
  pod 'RNFBApp', :path => '../node_modules/@react-native-firebase/app'
  pod 'RNFBAnalytics', :path => '../node_modules/@react-native-firebase/analytics'
  pod 'RNSVG', :path => '../node_modules/react-native-svg'
  pod 'GoogleIDFASupport', '~> 3.14.0'

  use_native_modules!
end

post_install do |installer|
  installer.pods_project.targets.each do |target|
    # The following is needed to ensure the "archive" step works in XCode.
    # It removes React & Yoga from the Pods project, as it is already included in the main project.
    # Without this, you'd see errors when you archive like:
    # "Multiple commands produce ... libReact.a"
    # "Multiple commands produce ... libyoga.a"

    targets_to_ignore = %w(React SSZipArchive JWT)

    if targets_to_ignore.include? target.name
      target.remove_from_project
    end

    if target.name == 'react-native-config'
      phase = target.project.new(Xcodeproj::Project::Object::PBXShellScriptBuildPhase)
      phase.shell_script = "cd ../../"\
                           " && RNC_ROOT=./node_modules/react-native-config/"\
                           " && export SYMROOT=$RNC_ROOT/ios/ReactNativeConfig"\
                           " && ruby $RNC_ROOT/ios/ReactNativeConfig/BuildDotenvConfig.ruby"

      target.build_phases << phase
      target.build_phases.move(phase,0)
    end
  end
end

steps to reproduce

react-native link
cd ios & pod install

I am facing the same issue..

Updating react-native-zip-archive and react-native-code-push will do the trick!

Updating react-native-zip-archive and react-native-code-push will do the trick!

@sidferreira I did not use react-native-zip-archive at all, and upgraded react-native-code-push to v5.7.0. It does not work.

Updating react-native-zip-archive and react-native-code-push will do the trick!

works after added the latest react-native-zip-archive

@sidferreira react native 0.59. Have you fixed it? Same error here.

For me removing the folder "rn-project/ios/build" and rebuilding worked.

Was this page helpful?
0 / 5 - 0 ratings

Related issues

jaysig picture jaysig  路  3Comments

SudoPlz picture SudoPlz  路  4Comments

ACCTFORGH picture ACCTFORGH  路  3Comments

chrisjrex picture chrisjrex  路  4Comments

djw27 picture djw27  路  3Comments