Actions
Bug #17788
closedruby 3.0.0 - compiling c++ extension on alpine fails
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux-musl]
Description
Compiling gem with C++ extension fails on alpine 3xx with Ruby 3.0.0 and Ruby 3.0.1
(does not fail on Ubuntu 18 ¯\(ツ)/¯)
Error:
compiling testgem.cc
In file included from /root/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby/ruby.h:39,
from /root/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby.h:38,
from testgem.cc:2:
/root/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby/internal/memory.h:275:16: error: conflicting declaration of 'void* ruby_nonempty_memcpy(void*, const void*, size_t)' with 'C' linkage
275 | #define memcpy ruby_nonempty_memcpy
| ^~~~~~~~~~~~~~~~~~~~
/root/.rbenv/versions/3.0.0/include/ruby-3.0.0/ruby/internal/memory.h:265:1: note: previous declaration with 'C++' linkage
265 | ruby_nonempty_memcpy(void *dest, const void *src, size_t n)
| ^~~~~~~~~~~~~~~~~~~~
Code for reproduction:
extconf.rb
require 'mkmf'
create_makefile 'testgem'
testgem.cc
#include <stdio.h>
#include <ruby.h>
#include <iostream>
VALUE says(VALUE _self, VALUE str) {
Check_Type(str, T_STRING);
puts(StringValueCStr(str));
return Qnil;
}
void Init_testgem() {
VALUE mod = rb_define_module("Simon");
const int num_args = 1;
std::cout << "*** testgem initialized ***" << std::endl;
rb_define_module_function(mod, "says", says, num_args);
}
Files
Updated by xtkoba (Tee KOBAYASHI) over 3 years ago
Repro (named bug17788.cc
):
#include <sys/types.h>
//extern "C" {
void *
ruby_nonempty_memcpy(void *dest, const void *src, size_t n)
{
return dest;
}
//}
#undef memcpy
#define memcpy ruby_nonempty_memcpy
#include <iostream>
$ x86_64-unknown-linux-musl-g++ -c bug17788.cc
bug17788.cc:13:16: error: conflicting declaration of 'void* ruby_nonempty_memcpy(void*, const void*, size_t)' with 'C' linkage
13 | #define memcpy ruby_nonempty_memcpy
| ^~~~~~~~~~~~~~~~~~~~
bug17788.cc:6:1: note: previous declaration with 'C++' linkage
6 | ruby_nonempty_memcpy(void *dest, const void *src, size_t n)
| ^~~~~~~~~~~~~~~~~~~~
A patch is attached for a workaround which wraps up the definition of ruby_nonempty_memcpy
with extern "C" { ... }
.
Updated by shyouhei (Shyouhei Urabe) over 3 years ago
Good catch! Patch LGTM.
Updated by xtkoba (Tee KOBAYASHI) over 3 years ago
Updated by xtkoba (Tee KOBAYASHI) over 3 years ago
- Status changed from Open to Closed
Applied in changeset git|29f6f79e7396018962eb25c5f5e409f5fe28a73b.
Get ruby_nonempty_memcpy
to have C linkage
Fixes [Bug #17788]
Updated by nagachika (Tomoyuki Chikanaga) over 2 years ago
- Backport changed from 2.5: UNKNOWN, 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN to 2.6: DONTNEED, 2.7: UNKNOWN, 3.0: REQUIRED
Updated by nagachika (Tomoyuki Chikanaga) over 2 years ago
- Backport changed from 2.6: DONTNEED, 2.7: UNKNOWN, 3.0: REQUIRED to 2.6: DONTNEED, 2.7: UNKNOWN, 3.0: DONE
ruby_3_0 2bb5fa495bf9d366d3c1fefc6b093dc4830f27bf merged revision(s) 29f6f79e7396018962eb25c5f5e409f5fe28a73b.
Updated by nagachika (Tomoyuki Chikanaga) over 2 years ago
- Backport changed from 2.6: DONTNEED, 2.7: UNKNOWN, 3.0: DONE to 2.6: DONTNEED, 2.7: DONTNEED, 3.0: DONE
Actions
Like0
Like0Like0Like0Like0Like0Like0Like0Like0