[Windows11, MinGW g++ 9.2.0, Visual C++17, FLTK 1.3.8, Visual Studio 2022]
Visual Studioでのlibファイル作成方法にヒントを得て、再度clコンパイラでライブラリ作成を試みたところうまくいきました。静的ライブラリlibと動的ライブラリdllが作成されます。
コマンドは以前のままで、cppファイルとヘッダファイルの関数の先頭に__declspec(dllexport)を付けるだけです。付けないとdllファイルのみ作成になります。
そもそも付けない場合にlibファイル、dllファイル両方作成するのが普通の感覚ではないのかと思ったりしますが、何かとクセが強いMicrosoftですから仕方ないです。
この方法でいけるとなると、Visual Studioでプロジェクトからlibファイル、dllファイルを作成するなんて面倒すぎてやってられません。
日本語まわりの仕様など洗練されているように見えるVisual C++ですが、実際に扱ってみるとなるほど中々の難物でした。まさに隣の芝はなんとやらです。
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <ctype.h>
#include <memory>
using std::string; using std::vector;
using std::cout; using std::endl;
class Funcs{
public:
__declspec(dllexport) string capitalizeString(string);
__declspec(dllexport) int getIndex(vector<string>&, string);
};
#include "Funcs.h"
__declspec(dllexport) string Funcs::capitalizeString(string s)
{
vector<char> s_char(s.begin(), s.end());
vector<char> s_char_up;
for (auto && c:s_char){
char c_up = toupper(c);
s_char_up.push_back(c_up);
}
string str(s_char_up.begin(), s_char_up.end());
return str;
}
__declspec(dllexport) int Funcs::getIndex(vector<string> &input, string searched) {
for (int i = 0; i < input.size(); i++) {
if (input[i] == searched) {
return i;
}
}
return -1;
}
cl /std:c++17 /I"D:\code\VC++\mylib_vc\include" /I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\include" ^
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\atlmfc\include" ^
/I"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Auxiliary\VS\include" ^
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt" ^
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\um" ^
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\shared" ^
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\winrt" ^
/I"C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\cppwinrt" ^
/I"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\Include\um" ^
"D:\code\VC++\mylib_vc\src\Funcs.cpp" /LD /EHsc /link /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\ATLMFC\lib\x64" /LIBPATH:"C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\lib\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\NETFXSDK\4.8\lib\um\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\lib\10.0.22000.0\ucrt\x64" /LIBPATH:"C:\Program Files (x86)\Windows Kits\10\\lib\10.0.22000.0\\um\x64" /LIBPATH:"D:\code\VC++\mylib_vc\lib"