PPS: the second-last example *doesn't* actually work, because blub.cc is 
compiled as C (I just didn't notice that because my blub.cc file was also 
valid C code).

I wrote an emscripten ticket here:

https://github.com/emscripten-core/emscripten/issues/14604
On Thursday, 8 July 2021 at 11:28:13 UTC+2 Floh wrote:

> Aha! This is actually a case where emcc behaves differently than clang:
>
> In emcc, the argument "-x c++" seems to affect *all* source files, while 
> in clang it only affects source files after the option. For instance (the 
> bla.c file contains an malloc without cast which fails in C++):
>
> emcc bla.c -x c++ blub.cc -o bla
>
> Fails because bla.c is compiled as C++. While in native clang (tested with 
> Apple's clang):
>
> clang bla.c -x c++ blub.cc -o bla
>
> ...everything compiles fine, because the "-x c++" only affects the blub.cc 
> file...
>
> And a few more examples to validate the theory:
>
> clang -x c++ blub.cc bla.c -o bla
>
> ...fails bcause bla.c is compiled as C++, but:
>
> clang -x c++ blub.cc -x c bla.c -o bla
>
> ...works. But this also works in emcc:
>
> emcc -x c++ blub.cc -x c bla.c -o bla
>
> But this does not:
>
> emcc -x c bla.c -x c++ blub.cc -o bla
>
> How weird! :D
>
> (PS: all tested with emcc 2.0.25)
> On Thursday, 8 July 2021 at 11:17:21 UTC+2 Floh wrote:
>
>> Hmm, that casting problem in the original code snippet should be 
>> unrelated to embind. 
>>
>> This command line from the article forces all .c files to be compiled as 
>> C++ because of the "-x c++" command line option:
>>
>> emcc --bind -O3 --std=c++11 a_c_file.c another_c_file.c *-x c++* 
>> your_cpp_file.cpp
>>
>> So that's the problem. If you drop both the "-std=c++11" and "-x c++" 
>> command line options it should work, because then the .c files will be 
>> compiled as C and the .cpp files as C++. If you actually need to control 
>> the C++ version used via "-std=c++11", then I think you need to invoke emcc 
>> twice, once to compile all .c files, and another time to compile all .cpp 
>> files (maybe there's another way to do it in one invokation I'm not aware 
>> of though).
>>
>> Cheers!
>>
>> On Thursday, 8 July 2021 at 00:45:51 UTC+2 [email protected] wrote:
>>
>>> Thanks for taking a look. I must be doing something incorrectly. Here is 
>>> the article I am trying to follow. Note this section "What about C?" 
>>> https://developers.google.com/web/updates/2018/08/embind#what_about_c
>>>
>>> *embind was written for C++ and can only be used in C++ files, but that 
>>> doesn't mean that you can't link against C files! To mix C and C++, you 
>>> only need to separate your input files into two groups: One for C and one 
>>> for C++ files and augment the CLI flags for emcc as follows:*
>>> *$ emcc --bind -O3 --std=c++11 a_c_file.c another_c_file.c -x c++ 
>>> your_cpp_file.cpp*
>>>
>>> I tried doing similar in my case where I replace the ".c" files with the 
>>> library I'm trying to bind, and I replace the ".cpp" file with my own 
>>> bindings file.
>>>
>>> Perhaps the included command is wrong?
>>>
>>> Cheers
>>> Ben
>>>
>>> On Tuesday, July 6, 2021 at 6:46:57 AM UTC-4 Floh wrote:
>>>
>>>> This is weird because it looks the .c file is compiled as C++ (not 
>>>> requiring a cast for malloc() is perfectly fine C code, but not valid C++ 
>>>> code).
>>>>
>>>> I would start looking into the build system instead of trying to 
>>>> "C++-ify" the C sources. Somehow the build system seems to treat .c files 
>>>> as C++ (maybe it always calls em++ instead of emcc? emcc should select the 
>>>> right language mode based on the file extension, while em++ forces C++ 
>>>> mode 
>>>> even for .c files.
>>>>
>>>> As a "hack" you can also force compilation in C mode with the "-x c" 
>>>> command line option, for instance:
>>>>
>>>> em++ bla.c -o bla -x c
>>>>
>>>> On Monday, 5 July 2021 at 02:18:37 UTC+2 [email protected] wrote:
>>>>
>>>>> Apologies if this is less of an embind question and more of a "how 
>>>>> does interop work with C and C++" question. I"m a bit inexperienced using 
>>>>> them together but in my case I'm trying to use embind, which requires 
>>>>> bindings written in C++, and the library I want to link is written in C. 
>>>>> When I try to link this library (
>>>>> https://github.com/korginc/volcasample) I get an error about implicit 
>>>>> pointer type conversion:
>>>>>
>>>>> ../volcasample/syro/korg_syro_volcasample.c:713:23: error: assigning 
>>>>> to 'uint8_t *' (aka 'unsigned char *') from incompatible type 'void *'
>>>>>                         psms[i].comp_buf = malloc(comp_dest_size + 
>>>>> comp_ofs);
>>>>>                                            ^
>>>>>
>>>>> I suppose I could convert the library to valid C++ with correct 
>>>>> casting but I'm hoping to avoid having to patch the source library in 
>>>>> order 
>>>>> to link it. Is there another way? A compiler flag to allow implicit 
>>>>> pointer 
>>>>> type casting or something like that?
>>>>>
>>>>> Thanks
>>>>> Ben
>>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/2287065a-1799-4da9-acfa-736e6065e3d5n%40googlegroups.com.

Reply via email to