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

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

新規登録して質問してみよう
ただいま回答率
85.50%
D言語

D言語は、プログラミング言語のひとつです。テンプレートメタプログラミング、関数型プログラミング、オブジェクト指向プログラミング等をサポートする汎用のシステム・アプリケーションプログラミング言語です。

Q&A

解決済

1回答

2225閲覧

Digital Mars製D言語コンパイラ(DMD)が使うリンカとdubの設定について

v_v

総合スコア47

D言語

D言語は、プログラミング言語のひとつです。テンプレートメタプログラミング、関数型プログラミング、オブジェクト指向プログラミング等をサポートする汎用のシステム・アプリケーションプログラミング言語です。

0グッド

0クリップ

投稿2016/09/28 01:21

D言語を現在学習しております。
OpenSSLでAESの暗号化をするため、静的ライブラリ(インポートライブラリではない)を使って実装することを試みています。
テストとして、以下のようなコードを組みました。

D言語

1import std.stdio; 2 3void main() 4{ 5}

ビルドコマンドは以下のような形です。
32ビット用
dmd -v -m32 source\app.d libs\ssleay32.lib libs\libeay32.lib
64ビット用
dmd -v -m64 source\app.d libs\ssleay64.lib libs\libeay64.lib

ここで、64ビット用のものは正しくビルドされます。
しかし32ビットのものはリンカエラーが出ます。
リンカエラーは下記のとおりです。

C:\D\dmd2\windows\bin\link.exe app,,nul,"libs\ssleay32.lib"+"libs\libeay32.lib"+user32+kernel32/noi; OPTLINK (R) for Win32 Release 8.00.17 Copyright (C) Digital Mars 1989-2013 All rights reserved. http://www.digitalmars.com/ctg/optlink.html libs\ssleay32.lib Error 43: Not a Valid Library File

原因はわかっていて、64ビットビルド時は、VisualStudioのlink.exeが使われます。
32ビットビルド時は、DigitalMars製のOptlinkが使われているようです。

そこで、32ビットビルド時、64ビットビルド時双方でVisualStudioのlink.exeを使わせたいと考えております。
コマンドラインでやる場合は、コンパイルだけしてリンカを叩くだけですので容易ですが
dubコマンドでビルドする際、自動的にリンカが選択されてしまいます。
dubコマンドで任意のリンカを選択する方法は有りますでしょうか。

現在のdub.jsonの内容です。

json

1{ 2 "name": "openssltest", 3 "authors": [ 4 "test" 5 ], 6 "description": "A minimal D application.", 7 "copyright": "Copyright © 2016, test", 8 "license": "proprietary", 9 "dependencies": { 10 "openssl": "~>1.1.4+1.0.1g" 11 }, 12 "sourceFiles":[ 13 "libs\\ssleay32.lib", 14 "libs\\libeay32.lib" 15 ] 16}

何卒よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因はリンカではなく、コンパイラが出力するオブジェクトファイルの形式だと思います。

dmd は、32ビット環境ではオブジェクトファイルを OMF 形式で出力します。
一方で VisualStudio などでコンパイルした静的ライブラリでは COFF 形式が使用されているため、リンク時に Not a Valid Library File (dmd は ssleay32.lib を OMF 形式と仮定してリンクしようとするが、実際は COFF 形式) と言われます。

64 ビット環境では、dmd も COFF 形式を使用するため、問題なくリンクできます。

dmd のオプションとして -m32 ではなく -m32mscoff を使えば、COFF 形式のオプジェクトを吐くようになるため、問題が解決できるのではないでしょうか。

参考: https://wiki.dlang.org/Compilers (Object file format の項)

投稿2016/09/28 16:23

tom-tan

総合スコア15

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

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

v_v

2016/09/29 00:50 編集

検証の結果、ビルド通りましたのでご報告いたします。 dub.jsonファイルに "dflags-x86":["-m32mscoff"] を追記することで解決しました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問