Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ffmpeg preset is linked against too recent GLIBC_2.17 #22

Closed
jjYBdx4IL opened this issue Oct 30, 2014 · 17 comments
Closed

ffmpeg preset is linked against too recent GLIBC_2.17 #22

jjYBdx4IL opened this issue Oct 30, 2014 · 17 comments

Comments

@jjYBdx4IL
Copy link

And therefore it does not load on Ubuntu 12.04. Tried to compile it on my system but that leads to SIGSEGV. Runnable example is https://github.com/jjYBdx4IL/misc/blob/master/src/test/java/jjybdx4il/javacv/examples/FFmpegTest.java at https://github.com/jjYBdx4IL/misc/ .

 * java.lang.UnsatisfiedLinkError: no jniavutil in java.library.path
 * at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1886)
 * at java.lang.Runtime.loadLibrary0(Runtime.java:849)
 * at java.lang.System.loadLibrary(System.java:1088)
 * at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:535)
 * at org.bytedeco.javacpp.Loader.load(Loader.java:410)
 * at org.bytedeco.javacpp.Loader.load(Loader.java:353)
 * at org.bytedeco.javacpp.avutil.<clinit>(avutil.java:10)
 * at java.lang.Class.forName0(Native Method)
 * at java.lang.Class.forName(Class.java:274)
 * at org.bytedeco.javacpp.Loader.load(Loader.java:385)
 * at org.bytedeco.javacpp.Loader.load(Loader.java:353)
 * at org.bytedeco.javacpp.avformat.<clinit>(avformat.java:13)
 * at org.bytedeco.javacv.FFmpegFrameRecorder.<clinit>(FFmpegFrameRecorder.java:106)
 * at jjybdx4il.javacv.examples.FFmpegTest.test(FFmpegTest.java:20)
 * at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 * at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 * at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 * at java.lang.reflect.Method.invoke(Method.java:606)
 * at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
 * at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
 * at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
 * at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
 * at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
 * at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
 * at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 * at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
 * at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
 * at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
 * at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
 * at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
 * at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
 * at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252)
 * at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141)
 * at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112)
 * at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 * at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
 * at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 * at java.lang.reflect.Method.invoke(Method.java:606)
 * at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189)
 * at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165)
 * at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85)
 * at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115)
 * at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75)
 * Caused by: java.lang.UnsatisfiedLinkError: /tmp/javacpp341118125695795/libjniavutil.so: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /tmp/javacpp341118125695795/libavutil.so.52)
 * at java.lang.ClassLoader$NativeLibrary.load(Native Method)
 * at java.lang.ClassLoader.loadLibrary1(ClassLoader.java:1965)
 * at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1890)
 * at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1851)
 * at java.lang.Runtime.load0(Runtime.java:795)
 * at java.lang.System.load(System.java:1062)
 * at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:524)
 * ... 39 more
@jjYBdx4IL
Copy link
Author

btw there is debootstrap, a nice debian command line utility that allows quick and easy setup of older debian chroot environments. I guess we need to build the libs on the oldest, supported platform...

@saudet
Copy link
Member

saudet commented Oct 31, 2014

Do you know of an equivalent for CentOS under Fedora? I was thinking of making builds with CentOS, but that adds complexity when I do a release, so I am sort of waiting for someone to share the load a bit :) Let me know if you would be interested in making the builds with Debootstrap or whatever works, thanks

@jjYBdx4IL
Copy link
Author

I have implemented it at https://github.com/jjYBdx4IL/javacpp-presets

You can do the builds using the free, public travis ci.

See https://travis-ci.org/jjYBdx4IL/javacpp-presets

I have added a module with basic tests there.

Currently only ffmpeg and opencv get built, so that needs to be extended and the ffmpeg test that is currently failing needs fixing, too. I can do most of it, but I don't think I can fix the test failure (SIGSEGV) as shown at the end of the travis build logs. https://api.travis-ci.org/jobs/39567132/log.txt?deansi=true

Regarding the release complexity, I really think we should merge all those jars into a single one. If you are OK with that idea, I will give it a try.

@saudet
Copy link
Member

saudet commented Oct 31, 2014

Thanks for trying things out! Does the test SIGSEGV because the build is bad? Or does it just fail because Travis CI won't let it run properly?

Sure, please do try to merge everything in one JAR. I'm sure some people would like to be able to build it that way.

@jjYBdx4IL
Copy link
Author

It does the same on my desktop.

@saudet
Copy link
Member

saudet commented Oct 31, 2014

Ok, so your test is bad? Or is this caused by a bug in my code somewhere?

@jjYBdx4IL
Copy link
Author

It fails when trying to instantiate FFmpegFrameRecorder at https://github.com/jjYBdx4IL/javacpp-presets/blob/master/tests/src/test/java/jjybdx4il/javacv/examples/FFmpegTest.java#L84

A detailed error dump was generated by the jvm and is available at the end of the travis build log:

https://api.travis-ci.org/jobs/39654016/log.txt?deansi=true

Here is an excerpt containing some of the relevant information:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f661112e4ea, pid=18388, tid=140076351932160
#
# JRE version: 6.0_31-b31
# Java VM: OpenJDK 64-Bit Server VM (23.25-b01 mixed mode linux-amd64 compressed oops)
# Problematic frame:
# C  [ld-linux-x86-64.so.2+0x164ea]  calloc+0x11da
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please include
# instructions how to reproduce the bug and visit:
#   http://icedtea.classpath.org/bugzilla
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

---------------  T H R E A D  ---------------

Current thread (0x0000000000615000):  JavaThread "main" [_thread_in_native, id=18391, stack(0x00007f661122c000,0x00007f661132d000)]

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x0000000000005490

Registers:
RAX=0x0000000000000001, RBX=0x00007f65fa81ba30, RCX=0x000000000000549b, RDX=0x00007f66112f5c30
RSP=0x00007f66112f5c28, RBP=0x00007f66112f5d80, RSI=0x00000000ffffffff, RDI=0x0000000000005490
R8 =0x00007f66112f5c30, R9 =0x0000000000000000, R10=0x0000000000000000, R11=0x0000000000000008
R12=0x0000000000a38040, R13=0x0000000000000000, R14=0x000000000000549b, R15=0x0000000000000000
RIP=0x00007f661112e4ea, EFLAGS=0x0000000000010286, CSGSFS=0x855b000000000033, ERR=0x0000000000000004
  TRAPNO=0x000000000000000e

Top of Stack: (sp=0x00007f66112f5c28)
0x00007f66112f5c28:   00007f6611123fff 0000000000000001
0x00007f66112f5c38:   0000000000a38040 0000000000000000
0x00007f66112f5c48:   00007f66112f5c60 00007f66112f5ca0
0x00007f66112f5c58:   00007f660b02dff3 00007f66112f5c60
0x00007f66112f5c68:   00000000c5b0b856 00007f66112f5cc0
0x00007f66112f5c78:   00000000c5b0cd48 0000000000000000
0x00007f66112f5c88:   00000000c5b0b8a0 0000000000000000
0x00007f66112f5c98:   00007f66112f5cb0 00007f66112f5c30
0x00007f66112f5ca8:   000000000b02dff3 0000000080000000
0x00007f66112f5cb8:   0000000000a38040 00007f66112f5c30
0x00007f66112f5cc8:   00007f66112f5c30 00000000c5b0c92b
0x00007f66112f5cd8:   00007f66112f5c30 00000001c5b0cd48
0x00007f66112f5ce8:   00007f66112f5d38 00007f66112f5d40
0x00007f66112f5cf8:   00007f66112f5d4f 00007f66112f5d10
0x00007f66112f5d08:   0000000000005468 0000000000a38040
0x00007f66112f5d18:   8000000000000000 0000000000005468
0x00007f66112f5d28:   00000000f06ba048 00007f66112f5d30
0x00007f66112f5d38:   00007f6611336040 0000000000000000
0x00007f66112f5d48:   0000000bc5b90ae0 0000000000000001
0x00007f66112f5d58:   00007f66112f5f50 0000000000a38040
0x00007f66112f5d68:   0000000000a3d110 0000000000000000
0x00007f66112f5d78:   00007f660ffaf36f 0000000080000001
0x00007f66112f5d88:   00007f6611129f5a 00000000f06ba088
0x00007f66112f5d98:   00000000f06ba048 000000000000002a
0x00007f66112f5da8:   000000000000002a 0000000000000000
0x00007f66112f5db8:   ffffffff80000001 00007f66112f5f50
0x00007f66112f5dc8:   00007f66112f5dc8 00000000c5b0c30c
0x00007f66112f5dd8:   0000000000000000 00007f66112f5fe0
0x00007f66112f5de8:   fffffffffffffffe 00007f660ffaf36f
0x00007f66112f5df8:   0000000000000005 0000000000a3d110
0x00007f66112f5e08:   00007f6611125906 00007f661132c6f8
0x00007f66112f5e18:   00007f66112f5fa0 00007f66112f5f98 

Instructions: (pc=0x00007f661112e4ea)
0x00007f661112e4ca:   c3 90 90 90 90 90 66 0f 6e ce 48 89 f9 66 0f 60
0x00007f661112e4da:   c9 48 83 e7 f0 66 0f ef d2 66 0f 60 c9 83 ce ff
0x00007f661112e4ea:   66 0f 6f 07 66 0f 70 c9 00 48 29 f9 66 0f 6f d8
0x00007f661112e4fa:   48 8d 7f 10 66 0f 74 c1 66 0f 74 da d3 e6 66 0f 

Register to memory mapping:

RAX=0x0000000000000001 is an unknown value
RBX=
[error occurred during error reporting (printing register info), id 0xb]

Stack: [0x00007f661122c000,0x00007f661132d000],  sp=0x00007f66112f5c28,  free space=807k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
C  [ld-linux-x86-64.so.2+0x164ea]  calloc+0x11da

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;)V+0
j  java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+300
j  java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+48
j  java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57
j  java.lang.System.load(Ljava/lang/String;)V+7
j  org.bytedeco.javacpp.Loader.loadLibrary([Ljava/net/URL;Ljava/lang/String;)Ljava/lang/String;+136
j  org.bytedeco.javacpp.Loader.load(Ljava/lang/Class;)Ljava/lang/String;+240
j  org.bytedeco.javacpp.Loader.load()Ljava/lang/String;+6
j  org.bytedeco.javacpp.avcodec$Cb_Pointer_int.<clinit>()V+0
v  ~StubRoutines::call_stub
j  java.lang.ClassLoader$NativeLibrary.load(Ljava/lang/String;)V+0
j  java.lang.ClassLoader.loadLibrary0(Ljava/lang/Class;Ljava/io/File;)Z+300
j  java.lang.ClassLoader.loadLibrary(Ljava/lang/Class;Ljava/lang/String;Z)V+48
j  java.lang.Runtime.load0(Ljava/lang/Class;Ljava/lang/String;)V+57
j  java.lang.System.load(Ljava/lang/String;)V+7
j  org.bytedeco.javacpp.Loader.loadLibrary([Ljava/net/URL;Ljava/lang/String;)Ljava/lang/String;+136
j  org.bytedeco.javacpp.Loader.load(Ljava/lang/Class;)Ljava/lang/String;+277
j  org.bytedeco.javacpp.Loader.load()Ljava/lang/String;+6
j  org.bytedeco.javacpp.avcodec.<clinit>()V+0
v  ~StubRoutines::call_stub
j  java.lang.Class.forName0(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+0
j  java.lang.Class.forName(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;+35
j  org.bytedeco.javacpp.Loader.load(Ljava/lang/Class;)Ljava/lang/String;+129
j  org.bytedeco.javacpp.Loader.load()Ljava/lang/String;+6
j  org.bytedeco.javacpp.avformat.<clinit>()V+0
v  ~StubRoutines::call_stub
j  org.bytedeco.javacv.FFmpegFrameRecorder.<clinit>()V+21
v  ~StubRoutines::call_stub
j  jjybdx4il.javacv.examples.FFmpegTest.test()V+28
v  ~StubRoutines::call_stub
j  sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+0
j  sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+87
j  sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+6
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+161
j  org.junit.runners.model.FrameworkMethod$1.runReflectiveCall()Ljava/lang/Object;+15
j  org.junit.internal.runners.model.ReflectiveCallable.run()Ljava/lang/Object;+1
j  org.junit.runners.model.FrameworkMethod.invokeExplosively(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+10
j  org.junit.internal.runners.statements.InvokeMethod.evaluate()V+12
j  org.junit.runners.ParentRunner.runLeaf(Lorg/junit/runners/model/Statement;Lorg/junit/runner/Description;Lorg/junit/runner/notification/RunNotifier;)V+17
j  org.junit.runners.BlockJUnit4ClassRunner.runChild(Lorg/junit/runners/model/FrameworkMethod;Lorg/junit/runner/notification/RunNotifier;)V+32
j  org.junit.runners.BlockJUnit4ClassRunner.runChild(Ljava/lang/Object;Lorg/junit/runner/notification/RunNotifier;)V+6
j  org.junit.runners.ParentRunner$3.run()V+12
j  org.junit.runners.ParentRunner$1.schedule(Ljava/lang/Runnable;)V+1
j  org.junit.runners.ParentRunner.runChildren(Lorg/junit/runner/notification/RunNotifier;)V+40
j  org.junit.runners.ParentRunner.access$000(Lorg/junit/runners/ParentRunner;Lorg/junit/runner/notification/RunNotifier;)V+2
j  org.junit.runners.ParentRunner$2.evaluate()V+8
j  org.junit.runners.ParentRunner.run(Lorg/junit/runner/notification/RunNotifier;)V+20
j  org.apache.maven.surefire.junit4.JUnit4Provider.execute(Ljava/lang/Class;Lorg/junit/runner/notification/RunNotifier;[Ljava/lang/String;)V+116
j  org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(Ljava/lang/Class;Lorg/apache/maven/surefire/report/RunListener;Lorg/junit/runner/notification/RunNotifier;)V+70
j  org.apache.maven.surefire.junit4.JUnit4Provider.invoke(Ljava/lang/Object;)Lorg/apache/maven/surefire/suite/RunResult;+133
v  ~StubRoutines::call_stub
j  sun.reflect.NativeMethodAccessorImpl.invoke0(Ljava/lang/reflect/Method;Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+0
j  sun.reflect.NativeMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+87
j  sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+6
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+161
j  org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(Ljava/lang/Object;Ljava/lang/reflect/Method;[Ljava/lang/Object;)Ljava/lang/Object;+3
j  org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(Ljava/lang/Object;)Lorg/apache/maven/surefire/suite/RunResult;+38
j  org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(Ljava/lang/Object;Ljava/lang/ClassLoader;Ljava/lang/ClassLoader;Ljava/lang/Object;Lorg/apache/maven/surefire/booter/ProviderConfiguration;ZLorg/apache/maven/surefire/booter/StartupConfiguration;Z)Lorg/apache/maven/surefire/suite/RunResult;+38
j  org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(Ljava/lang/Object;Ljava/lang/ClassLoader;Lorg/apache/maven/surefire/booter/StartupConfiguration;Lorg/apache/maven/surefire/booter/ProviderConfiguration;Ljava/io/PrintStream;)Lorg/apache/maven/surefire/suite/RunResult;+45
j  org.apache.maven.surefire.booter.ForkedBooter.main([Ljava/lang/String;)V+136
v  ~StubRoutines::call_stub

@jjYBdx4IL
Copy link
Author

ok, I found the problem: the libav* libs depend on each other and the loading sequence seems to be random, so the system's native shared lib loader cannot resolve the shared libs' dependencies. Can we drop using our own javacpp.Loader that unpacks the shared objects and just require that the libs must be on the java library path? Using maven, the following approach should be ok when working with the mvn command: http://blog.dub.podval.org/2011/01/native-libraries-with-maven.html

@saudet
Copy link
Member

saudet commented Nov 1, 2014

They don't get loaded in random order... BTW, could you try again with the develop branch where this bug has been fixed: #13 Thanks!

Of course we can use libraries installed on the system, but the compiler needs to know where to find header files and linkable files. Those directories can be specified in the pom.xml file, overriding the ones from the parent pom.xml here:
https://github.com/bytedeco/javacpp-presets/blob/develop/pom.xml#L140

@jjYBdx4IL
Copy link
Author

No, I'm not talking of using libs provided by the OS. The regular way to include shared libs with your java app is to put them into a directory and specify that dir via -Djava.library.path as demonstrated in https://github.com/jjYBdx4IL/javacpp-presets/blob/master/tests/pom.xml . I can see that there might be some fringe cases where dynamically extracting the libs from the jars may be useful, but I suggest making that behavior optional and off by default because it is non-standard and can be very tricky to resolve.

btw. using the java.library.path solution made my tests work just fine.

@jjYBdx4IL jjYBdx4IL reopened this Nov 1, 2014
@jjYBdx4IL
Copy link
Author

Regarding the original issue (libs not running on slightly older systems), I'll try to implement a maven plugin that will use kvm and prepared debian disk images to automatically create the entire build via a single command. It will basically copy the unbuilt source tree into the kvm guest, build and test it there, then pull the artifacts out of it in order to install and deploy them where the user has originally started the mvn command.

@saudet
Copy link
Member

saudet commented Nov 1, 2014

Regarding the shared libs, how do you see this work for end users of applications not using Maven?

Regarding the build system, we need something that works for Mac OS X and Windows as well, so please keep that in mind, thanks!

@jjYBdx4IL
Copy link
Author

The kvm solution would be optional for linux systems so you don't have to (manually) install old or different linux OSes in order to build the libs on them, it would work on-the-fly, not necessarily very fast, of course.

That, of course, does not work with Mac and Windows because those systems are not freely available. Maybe I move the kvm build to another , independent module. Did you try cross-compilation for the non-free platforms?

Any ideas? What would be your preferred way to build compatible linux libs? kvm would at least work on most linux systems and is way less intrusive than chroot solutions which require root privileges.

(remark: personally, I would just drop support for non-free systems if you cannot cross-compile for them from a linux box. Offer it as a paid service instead. Too much hazzle, if it cannot be done automatically. If you have Mac OS and Windows disk images runnable inside kvm, you could of course, use them and make the build automatic for those platforms too)

@saudet
Copy link
Member

saudet commented Nov 2, 2014

If we can use the Android NDK and MinGW-w64 on Travis CI, I'm pretty sure it would be feasible to makes builds for free for all platforms there, including Mac OS X, so let's concentrate on that. What do you say?

@jjYBdx4IL
Copy link
Author

I don't think travis ci is flexible enough and nobody knows how long the service will last. First of all they don't provide caching and AFAIK Mac/windows are only or paid subscribers. They don't even provide a generic http/ftp proxy. Then there is the problem that they only provide one linux system and have a build time limit of 50 minutes. Currently, bootstrapping older Linux OSes on the travis machines is working, but I doubt that it is supported in any way so it could stop working every day. I think kvm is the most flexible solution and computational-wise it is nearly 100% efficient, though often disk speed is lacking. They may provide Mac/Windows for free some day, but even then it is likely not the correct version and could render the generated libs largely incompatible .

@saudet
Copy link
Member

saudet commented Nov 3, 2014

I didn't try it, but I'm pretty sure Mac OS X builds are free on Travis CI for open source projects. Anyway, please do experiment with things that interest you, and let me know what works out in the end! Thanks

@saudet
Copy link
Member

saudet commented Oct 30, 2015

The Linux binaries for version 1.1 were built in a CentOS 6 Docker container, so that should fix this issue. If these kinds of error messages still pop up though, please let me know! And thanks for reporting

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants