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

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

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

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

6519閲覧

Visual Stadioでlibcurlを用いたDLLをビルドできません。

RYO_U

総合スコア28

MQL4

MQL4とは、MT4(MetaTrader4)で用いられるプログラム言語です。MT4は無料で使えるチャートソフトあり、MQL4を使うことで分析ツールのオリジナルスクリプトの作成ができます。

cURL

cURLはHTTP, FTPやTelnetなど複数のプロトコルを用いてデータを転送するライブラリとコマンドラインツールを提供します。

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/05/12 06:01

編集2020/05/12 14:26

前提・実現したいこと

MQL4からDLLを用いて、LineNotifyのAPIを使い通知する機能を作っています。

Windows10を使用しており、Visual Stadio 2019で開発をしています。

https://youtu.be/q_mXVZ6VJs4
上記動画の通り、X86 Natice Tools Command Promt fo VS2019を使いビルドしました。
コンソールアプリケーションだと通知することができました。
libcurlの関数を使用せずにMQL4からDLLを使うこともできました。

発生している問題・エラーメッセージ

c++

1エラー LNK2001 外部シンボル "_curl_mime_name@8" は未解決です。 1 2エラー LNK2001 外部シンボル "_curl_slist_free_all@4" は未解決です。 1 3エラー LNK2001 外部シンボル "_curl_slist_append@8" は未解決です。 1 4エラー LNK2001 外部シンボル "_curl_mime_init@4" は未解決です。 1 5エラー LNK2001 外部シンボル "_curl_mime_free@4" は未解決です。 1 6エラー LNK2001 外部シンボル "_curl_mime_data@12" は未解決です。 1 7エラー LNK2001 外部シンボル "_curl_mime_addpart@4" は未解決です。 1 8エラー LNK2001 外部シンボル "_curl_global_init@4" は未解決です。 1 9エラー LNK2001 外部シンボル "_curl_global_cleanup@0" は未解決です。 1 10エラー LNK2001 外部シンボル "_curl_easy_perform@4" は未解決です。 1 11エラー LNK2001 外部シンボル "_curl_easy_init@0" は未解決です。 1 12エラー LNK2001 外部シンボル "_curl_easy_cleanup@4" は未解決です。 1 13警告 C26812 列挙型 'CURLcode' は対象範囲外です。'enum' (Enum.3) より 'enum class' を優先します 14

該当のソースコード

c++

1// dllmain.cpp : DLL アプリケーションのエントリ ポイントを定義します。 2#define CURL_STATICLIB 3#include "pch.h" 4#include "curl/curl.h" 5 6 7 8BOOL APIENTRY DllMain( HMODULE hModule, 9 DWORD ul_reason_for_call, 10 LPVOID lpReserved 11 ) 12{ 13 switch (ul_reason_for_call) 14 { 15 case DLL_PROCESS_ATTACH: 16 case DLL_THREAD_ATTACH: 17 case DLL_THREAD_DETACH: 18 case DLL_PROCESS_DETACH: 19 break; 20 } 21 return TRUE; 22} 23DLLFUNC_MQL4 int __stdcall notifyLineAPI() 24{ 25 curl_global_init(CURL_GLOBAL_ALL); 26 CURL* curl = curl_easy_init();; 27 CURLcode res; 28 29 curl_mime* mime1; 30 curl_mimepart* part1; 31 struct curl_slist* slist1; 32 mime1 = NULL; 33 slist1 = NULL; 34 35 if (curl) { 36 slist1 = curl_slist_append(slist1, "Authorization: Bearer Access Token"); 37 38 curl_easy_setopt(curl, CURLOPT_BUFFERSIZE, 102400L); 39 curl_easy_setopt(curl, CURLOPT_URL, "https://notify-api.line.me/api/notify"); 40 curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); 41 curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); 42 mime1 = curl_mime_init(curl); 43 part1 = curl_mime_addpart(mime1); 44 45 curl_mime_data(part1, "TEST", CURL_ZERO_TERMINATED); 46 curl_mime_name(part1, "message"); 47 curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime1); 48 curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist1); 49 curl_easy_setopt(curl, CURLOPT_USERAGENT, "curl/7.67.0"); 50 curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 50L); 51 curl_easy_setopt(curl, CURLOPT_HTTP_VERSION, (long)CURL_HTTP_VERSION_NONE); 52 curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "POST"); 53 curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L); 54 res = curl_easy_perform(curl); 55 56 curl = NULL; 57 curl_mime_free(mime1); 58 mime1 = NULL; 59 curl_slist_free_all(slist1); 60 slist1 = NULL; 61 res = curl_easy_perform(curl); 62 63 64 } 65 66 curl_easy_cleanup(curl); 67 curl_global_cleanup(); 68 69 return 1; 70}

試したこと

curl_global_init(CURL_GLOBAL_ALL);からすでに未解決エラーが出ているようでした

補足情報(FW/ツールのバージョンなど)

libcurl.libを【リンカー】→【入力】でリンクしております。
また、それでもだめでしたので、フルパスで入力してみましたが、だめでした。
ここにより詳細な情報を記載してください。

構成
ライブラリディレクトリ
追加インクルード
追加ライブラリ
追加依存

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

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

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

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

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

guest

回答3

0

ベストアンサー

curlのFAQのこれとか関係ありそうですけど、どうでしょう
5.7 Link errors when building libcurl on Windows!


5/13追記

下記手順で、スタティックライブラリ作成、DLLビルド成功までを確認しました。
0. curl公式からソースをダウンロードし展開(curl-7.70.0.zip)
0. x86 NativeToolsCommandPrompt for VS 2017 起動
0. (curlディレクトリ)/winbuild へ移動
0. 同ディレクトリの BUILD.WINDOWS.txt を参考に、nmake /f Makefile.vc mode=static VC=15 でビルド
0. VS2017でVC++のDLLプロジェクト作成
0. プロジェクトの全ての構成に対して、インクルードディレクリ、ライブラリディレクトリを追加
include:(curlディレクトリ)\builds\libcurl-vc15-x86-release-static-ipv6-sspi-winssl\include
lib:(curlディレクトリ)\builds\libcurl-vc15-x86-release-static-ipv6-sspi-winssl\lib
0. RYO_Uさんのソースを若干修正してビルド

  • pch.h の #include "framework.h" 後に追加

c++

1#define CURL_STATICLIB 2#include <curl/curl.h>
  • dllmain.cpp に RYO_Uさんのソースを貼り付けし、DLLFUNC_MQL4(型が分からないので)を削除してインクルード部書き換えとlib参照用pragma追加

c++

1#include "pch.h" 2 3#pragma comment(lib,"libcurl_a.lib") 4#pragma comment(lib,"ws2_32.lib") 5#pragma comment(lib,"Wldap32.lib") 6#pragma comment(lib,"Normaliz.lib") 7#pragma comment(lib,"Crypt32.lib")

投稿2020/05/12 07:05

編集2020/05/13 02:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

RYO_U

2020/05/12 08:38

「プリプロセッサ定義」セクションにCURL_STATICLIBを追加してみましたが、同様のエラーが発生してしまいます
退会済みユーザー

退会済みユーザー

2020/05/12 13:10

ちなみに、生成されたlibファイルをバイナリエディタ等で覗いた時、未解決になった関数名は含まれていましたか?
RYO_U

2020/05/12 14:10

txtにしてみたときには関数名はありました。
退会済みユーザー

退会済みユーザー

2020/05/13 01:36

試しにビルドしてみたら出来たので、手順を書いてみました。
RYO_U

2020/05/13 04:00

現在VC2017をインストール中です。 DLLFUNC_MQL4はint型で、pch.h に #define DLLFUNC_MQL4 extern "C"__declspec(dllexport) と追加しています。
SHOMI

2020/05/13 04:16

こちらはVisuallStudio2019でビルドしましたが問題なくリンクまでできていますよ
RYO_U

2020/05/13 05:16

VC2017でビルドしたらできました! ありがとうございます! コードの変更なく、投稿時のコードで通ったのでVC2017とVC2019で何か変わったんだと思います(-_-;)
退会済みユーザー

退会済みユーザー

2020/05/13 05:22

SHOMIさんはビルド出来ているようなので、中間ファイル等を削除してクリーンにして最初からやってみたら、ひょっとしたら2019でも行けるかもしれませんね 私は2019にはVC++入れてないので試せませんが
RYO_U

2020/05/13 05:35

なるほど…中間ファイル等を削除というのはやっていませんでした! ありがとうございます!
guest

0

十中八九ライブラリが足りてない。libcurl.lib をリンクしてないんじゃなくて?

投稿2020/05/12 06:10

episteme

総合スコア16612

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

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

RYO_U

2020/05/12 06:19

libcurl.libを【リンカー】→【入力】でリンクしております。 また、それでもだめでしたので、フルパスで入力してみましたが、だめでした。
guest

0

libcurl.libをリンクし忘れていませんか。
スタティックリンク版を使う(CURL_STATICLIBをdefineしている)のであれば、リンクすべきライブラリはlibcurl_a.lib(Release版)/libcurl_a_debug.lib(Debug版)です。


C++

1#define CURL_STATICLIB 2#include "pch.h" 3#include "curl/curl.h"

プリコンパイル済みヘッダが有効時は#include "pch.h"より前の行にコードを書いても反映されません。
pch.hの中もしくは#include "pch.h"より後に書いてください。
今回なら#include "curl/curl.h"の前ですね。


エラーを見る限りでは実際にビルドしているものとは異なる構成/プラットフォームの設定を変更しているとしか思えません。
#include "curl/curl.h"の次の行に
#pragma comment(lib,"libcurl_a.lib")
を追加してビルドするとどうなりますか。
libcurl_a.libのリンクエラーが出るならライブラリディレクトリを指定した構成/プラットフォームが間違っています。
エラーなく通るなら追加の依存ファイルを指定した構成/プラットフォームが間違っています。


#pragma comment(lib,"libcurl_a.lib")
を入れる前の状態に戻し、
リンカー-全般-進行状況の表示-詳細情報をすべて表示(/VERBOSE)としてビルドし、
出力ウインドウのビルドlibcurl_a.libは表示されていますか。

投稿2020/05/12 06:07

編集2020/05/13 04:33
SHOMI

総合スコア4079

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

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

RYO_U

2020/05/12 06:21

上の方と同様なのですが、libcurl.libはリンク済みになっております…
SHOMI

2020/05/12 06:26

もしかしてReleaseのほうに設定してDebugでビルドしているもしくはその逆とかなのでは?
RYO_U

2020/05/12 06:30

今確認しましたが、合っていました。
RYO_U

2020/05/12 07:32

プリコンパイル済みヘッダは無効にしておりましたが、有効にし、やってみましたが、同じエラーが発生してしまいました。
RYO_U

2020/05/12 12:48

再度ビルドし、libcurl_a.libをリンクしました。 また、cmakeでのビルドも試してみましが、同様のエラーです。。。 他に設定などあるのでしょうか?
SHOMI

2020/05/12 13:29 編集

こちらでもDLLFUNC_MQL4のみコメントアウトしてビルドしてみましたが、libcurl_a.libをリンクすれば質問文のリンクエラーは出ませんでした。 libcurl_a.libをリンクしていないと質問文のリンクエラーが出ます。 x86/x64を間違えていませんか?
RYO_U

2020/05/12 14:28

プロパティの画像を追加しました。 #pragma comment(lib,"libcurl_a.lib")を追加しましたが、エラーがなく通りました。 プラットフォームは画像の通り、になります。
SHOMI

2020/05/13 03:42

>#pragma comment(lib,"libcurl_a.lib")を追加しましたが、エラーがなく通りました。 追加してエラーなくリンクまでできたならリンカー設定が間違っていますね。
SHOMI

2020/05/13 03:51

他にあり得るとしたらlibcurlに依存するコードを含むライブラリをlibcurlより後にリンクした場合ですが、プロパティ画像を見る限りはなさそうですし…
RYO_U

2020/05/13 04:03

上の回答者radhianさんのがリンクしたものと一緒のはずです。 ビルドしものをコピペで張り付けてるので、問題ないはずなのですが・・・
SHOMI

2020/05/13 04:45

>ビルドしものをコピペで張り付けてるので、問題ないはずなのですが・・・ 64bit版と32bit版ライブラリのファイル名は同じですが、間違えると質問と同じエラーになります。 間違いなく32bit版をコピーしたのですか? コピーせずbuilds\libcurl-vc16-x86-release-static-ipv6-sspi-winssl\libを指定すると通ったりしませんか。
RYO_U

2020/05/13 04:53

>コピーせずbuilds\libcurl-vc16-x86-release-static-ipv6-sspi-winssl\libを指定すると通ったりしませんか。 同様のエラーが出てしまいました
RYO_U

2020/05/13 05:15

VC2017でビルドしたらエラーなく通りました。 色々とありがとうございました! VC17と19の差でこのようなリンクエラーが発生する原因などはあるのでしょうか?
SHOMI

2020/05/13 05:24

2019で問題なくビルドが通っています。 プロジェクト設定がまずいだけで、プロジェクトを作り直してやれば2019でもビルドが通るのではないでしょうか。
RYO_U

2020/05/13 06:19

プロジェクトの作り直しもやっていませんでした… ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問