non vorrei lavorare

昔はおもにプログラミングやガジェット系、今は?

C++でCから呼び出せる関数を書いて、組み込んだJuliaから呼び出した

こんばんは、以前購入した恐竜の着ぐるみ?(空気で膨らませるタイプ)をサンタさんに次男がお願いしてますが、却下され、乗り鉄活動の資金の代案が示された@kjunichiです。

背景

Julia公式のJuliaの組み込みの章にでてくるスレッドを扱うソースの例が動かせずにいた。

docs.julialang.org

このページの下のほうの「An example of calling the Julia C API from a thread started by Julia itself:」のソース。

Cにすれば動きそうだが、問題が

JuliaのソースはCで書かれているので、WindowsでもCのソースとしてコンパイルできれば動きそうなものなのだが、拡張子を.cにしてコンパイルすると、コンパイルエラーとなってします。エラー内容的には関連するヘッダファイルを参照してそこの記載がC++で記載されているようでそこでCだとエラーとなっている模様。

main.c
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(36): error C2061: 構文エラー: 識別子 'atomic_bool'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(36): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(37): error C2061: 構文エラー: 識別子 'atomic_char'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(37): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(38): error C2061: 構文エラー: 識別子 'atomic_schar'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(38): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(39): error C2061: 構文エラー: 識別子 'atomic_uchar'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(39): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(40): error C2061: 構文エラー: 識別子 'atomic_short'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(40): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(41): error C2061: 構文エラー: 識別子 'atomic_ushort'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(41): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(42): error C2061: 構文エラー: 識別子 'atomic_int'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(42): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(43): error C2061: 構文エラー: 識別子 'atomic_uint'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(43): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(44): error C2061: 構文エラー: 識別子 'atomic_long'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(44): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(45): error C2061: 構文エラー: 識別子 'atomic_ulong'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(45): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(46): error C2061: 構文エラー: 識別子 'atomic_llong'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(46): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(47): error C2061: 構文エラー: 識別子 'atomic_ullong'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(47): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(48): error C2061: 構文エラー: 識別子 'atomic_char16_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(48): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(49): error C2061: 構文エラー: 識別子 'atomic_char32_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(49): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(50): error C2061: 構文エラー: 識別子 'atomic_wchar_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(50): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(51): error C2061: 構文エラー: 識別子 'atomic_int_least8_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(51): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(52): error C2061: 構文エラー: 識別子 'atomic_uint_least8_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(52): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(53): error C2061: 構文エラー: 識別子 'atomic_int_least16_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(53): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(54): error C2061: 構文エラー: 識別子 'atomic_uint_least16_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(54): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(55): error C2061: 構文エラー: 識別子 'atomic_int_least32_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(55): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(56): error C2061: 構文エラー: 識別子 'atomic_uint_least32_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(56): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(57): error C2061: 構文エラー: 識別子 'atomic_int_least64_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(57): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(58): error C2061: 構文エラー: 識別子 'atomic_uint_least64_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(58): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(59): error C2061: 構文エラー: 識別子 'atomic_int_fast8_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(59): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(60): error C2061: 構文エラー: 識別子 'atomic_uint_fast8_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(60): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(61): error C2061: 構文エラー: 識別子 'atomic_int_fast16_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(61): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(62): error C2061: 構文エラー: 識別子 'atomic_uint_fast16_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(62): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(63): error C2061: 構文エラー: 識別子 'atomic_int_fast32_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(63): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(64): error C2061: 構文エラー: 識別子 'atomic_uint_fast32_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(64): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(65): error C2061: 構文エラー: 識別子 'atomic_int_fast64_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(65): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(66): error C2061: 構文エラー: 識別子 'atomic_uint_fast64_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(66): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(67): error C2061: 構文エラー: 識別子 'atomic_intptr_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(67): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(68): error C2061: 構文エラー: 識別子 'atomic_uintptr_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(68): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(69): error C2061: 構文エラー: 識別子 'atomic_size_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(69): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(70): error C2061: 構文エラー: 識別子 'atomic_ptrdiff_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(70): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(71): error C2061: 構文エラー: 識別子 'atomic_intmax_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(71): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(72): error C2061: 構文エラー: 識別子 'atomic_uintmax_t'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(72): error C2059: 構文エラー: ';'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(121): error C2061: 構文エラー: 識別子 '_Atomic'
C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.38.33130\include\vcruntime_c11_stdatomic.h(122): error C2059: 構文エラー: '}'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(41): error C2061: 構文
エラー: 識別子 'alignas'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(42): error C2143: 構文
エラー: ')' が '定数' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(42): error C2143: 構文
エラー: '{' が '定数' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(42): error C2059: 構文
エラー: '定数'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(42): error C2059: 構文
エラー: ')'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(43): error C2143: 構文
エラー: ')' が '定数' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(43): error C2143: 構文
エラー: '{' が '定数' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(43): error C2059: 構文
エラー: '定数'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(43): error C2059: 構文
エラー: ')'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(44): error C2059: 構文
エラー: '}'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(46): error C2143: 構文
エラー: ')' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(46): error C2143: 構文
エラー: '{' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(46): error C2059: 構文
エラー: '型'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(46): error C2059: 構文
エラー: ')'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(67): error C2143: 構文
エラー: ')' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(67): error C2143: 構文
エラー: '{' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(67): error C2059: 構文
エラー: '型'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(67): error C2059: 構文
エラー: ')'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(88): error C2143: 構文
エラー: ')' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(88): error C2143: 構文
エラー: '{' が '*' の前にありません。
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(88): error C2059: 構文
エラー: '型'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\work-stealing-queue.h(88): error C2059: 構文
エラー: ')'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\julia_threads.h(104): error C2061: 構文エラー
: 識別子 '_Atomic'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\julia_threads.h(106): error C2059: 構文エラー
: '}'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\julia_threads.h(115): error C2061: 構文エラー
: 識別子 '_Atomic'
C:\Users\kjw_j\.julia\juliaup\julia-1.11.2+0.x64.w64.mingw32\include\julia\julia_threads.h(115): fatal error C1003: プロ
グラム内のエラーが 100 個を超えました。コンパイルは中断されます。

自作PCで活動再開

久しぶりに自作PCで手元に自由に使えるPCができたので、背景に書いた作業の続きを行った。

実はMacOSでも同じソースを動かそうとして、1年近く前に取り組んだが、Julia側からソースに記載した関数を呼び出せずにいた。

どうなれば動かくは分かるが

WindowsというかC++のソース中に記載した関数をCの関数としてコンパイルできればJuliaからも呼べることは理解できてはいたが、今回のタイミングまで、

extern "C"

を関数手前につける程度の対応しか出来ていなかった。

DLL周りのことを思い出し、解決に

WindowsのDLLを作成する場合、C++コンパイラに呼び出し規約の指定ができることが分かった。(最初に気づけ!)

double c_func(int i)

とc_funcを宣言して定義している個所を以下のようにexter "C"に加え、呼び出し規約を指定して

extern "C" __declspec(dllexport)
double c_func(int i)

と変更することで無事動いた。

MacOSの問題も解決した

MacOSで動かなかったのは、Windows <->Macを行き来するさいにC++のコードとしてビルドを行っており、MacOSではCとして扱えば、すんなり動いた。。

関連記事

11年前の記事

10年前の記事

9年前の記事

7年前の記事

6年前の記事