実現したいこと
openMPをnimで呼び出して、並列処理を行いたいので、nimにcを埋め込むprogmaを利用してopenMPを使用しようとしています。
発生している問題・分からないこと
nim c -r openmp.nimでコンパイルしようとすると、-ldlが見つからないというエラーが出ています。-ldlはこの質問以前に起こったエラーである
c:/users/User/.choosenim/toolchains/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: c:/users/User/.choosenim/toolchains/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../lib\libgomp.a(target.o):(.text+0x6da): undefined reference to `dlopen' //dlopen以外にdlsym,dlclose,dlerror等が出る
というものを解決するために、
nim
1{.passC: "-ldl".} 2{.passL: "-ldl".}
というpragmaを使ってgccにオプションで渡したものですが、そこで今回のエラーが出たというわけです。
エラーメッセージ
error
1Hint: [Link] 2c:/users/User/.choosenim/toolchains/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: cannot find -ldl 3collect2.exe: error: ld returned 1 exit status 4Error: execution of an external program failed: 'gcc.exe -o C:\Users\User\source\repos\nim-openmp\openmp.exe C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@sexceptions.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@ssince.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@sctypes.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@ssysatomics.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@sansi_c.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@smemory.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@ssyslocks.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@sthreadtypes.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@sdigitsutils.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@smiscdollars.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sassertions.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@siterators.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@scoro_detection.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@sdragonbox.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@sschubfach.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sformatfloat.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sobjectdollar.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@sdollars.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@stypedthreads.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@sstacktraces.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sprivate@sbitops_utils.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@scountbits_impl.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem@srepr_v2.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@swidestrs.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@score@slocks.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@sexitprocs.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@sstd@ssyncio.nim.c.o C:\Users\User\nimcache\openmp_d\@m..@s..@s..@s.choosenim@stoolchains@snim-2.0.8@slib@ssystem.nim.c.o C:\Users\kiyok\nimcache\openmp_d\@mopenmp.nim.c.o -fopenmp -ldl -Wl,-Bstatic -lpthread'
該当のソースコード
nim
1{.passC: "-fopenmp".} 2{.passL: "-fopenmp".} 3{.passC: "-ldl".} 4{.passL: "-ldl".} 5{.emit: """ 6#include <omp.h> 7#include <stdio.h> 8""".} 9 10proc main():string = 11 {.emit:""" 12 13 #pragma omp parallel 14 { 15 printf("Hello World!\n"); 16 } 17 """.} 18 return "test" 19 20echo main()
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
上記のある通り、dlopen等のエラーを解決するために現在のコードにしましたが、それでも今のようにエラーが出てコンパイルできていません。
補足
もし、もっと筋の良い並列化方法があれば教えていただきたいです。例えば、上で書いたコードは並列化処理したい部分はCで書く必要がありますが、nimにできればとても便利になります。
バージョン
nim:2.0.8 stable
gcc:gcc version 11.1.0 (MinGW-W64 x86_64-posix-seh, built by Brecht Sanders)
OS:Windows 10 home
回答2件
あなたの回答
tips
プレビュー