質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

並列処理

複数の計算が同時に実行される手法

Q&A

解決済

2回答

198閲覧

nimでopenMPを使おうとするとx86_64-w64-mingw32/bin/ld.exe: cannot find -ldlというエラーが出る

kiyoken

総合スコア15

Nim

Nimは、静的型付けプログラミング言語。Pythonの生産性でありながら、C言語のような高いパフォーマンスも持ち併せます。さらに自由度の高い言語で拡張性も重視されています。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

並列処理

複数の計算が同時に実行される手法

0グッド

0クリップ

投稿2024/10/18 14:57

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiyoken

2024/10/18 17:30

ありがとうございます。そのファイルを解凍して"C:\Users\User\.choosenim\toolchains\mingw64"に置いたところ、なぜか-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' 達が再び出てきてしまいました。ファイルを置くパスを間違ったかなと思って"C:\Users\User\.choosenim\toolchains\mingw64\x86_64-w64-mingw32"の方においても同様でした。 そして、ファイルを展開前に戻したらこの質問のエラーに戻りました。 なぜこんな振る舞いをするのか謎です...
Manabu

2024/10/19 23:22

コマンドオプションとして -L 相対パス -l libファイル を追加するか、g++.exeまでのフルパスを打った上でオプションを渡してみましょう
guest

回答2

0

自己解決

nimのコンパイルオプションをよく調べて、ソース中にpragmaで埋め込むのではなく、--passL:libdl.dllというオプションを追加することでコンパイルできました。

nim

1{.passC: "-fopenmp".} 2{.passL: "-fopenmp".} 3{.emit: """ 4#include <omp.h> 5#include <stdio.h> 6""".} 7 8proc main():string = 9 {.emit:""" 10 11 #pragma omp parallel 12 { 13 printf("Hello World!\n"); 14 } 15 """.} 16 return "test" 17 18echo main()

コンパイルオプション

nim c -r --passL:libdl.dll openmp.nim

投稿2024/10/20 06:36

kiyoken

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なぜか-ldlを渡して解決したはずの

それは解決したんじゃなくて、-ldlを渡してリンク自体をエラーで実行できないようにしたために、エラーが出てこないようになった、だけです。

エラーが出たなら、そのエラーの意味を理解して、そのエラーの解決を行いましょう

undefined reference to `dlopen'

dlopenという関数(の実体)が見つからない、とおっしゃってますので、それをどうにかしましょう

投稿2024/10/18 21:55

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kiyoken

2024/10/19 05:04

ありがとうございます。 dlopenとかが入ってるheaderであるdlfcn.hをインクルードしてみても変わりませんでした。当すればいいでしょうか? {.passC: "-fopenmp".} {.passL: "-fopenmp".} {.passC: "-ldl".} {.passL: "-ldl".} {.emit: """ #include <omp.h> #include <stdio.h> #include <dlfcn.h> """.} proc main():string = {.emit:""" #pragma omp parallel { printf("Hello World!\n"); } """.} return "test" echo main()
y_waiwai

2024/10/19 23:00

ヘッダファイルには関数の定義しか入ってません。 コンパイルは関数の定義があればそれでエラーは出なくなりますが、 その実態のコードがなければ、リンク時にそういうエラーになります コンパイル、リンク、そしてライブラリ、のそれぞれの役割を勉強しましょう
kiyoken

2024/10/20 06:35

ありがとうございます。 nimのコンパイルオプションをよく調べて、ソース中にpragmaで埋め込むのではなく、--passL:libdl.dllというオプションを追加することでコンパイルできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問