fc2ブログ

XXX.jarにメイン・マニフェスト属性がありません

emotionサイトトップ > NetBeans >XXX.jarにメイン・マニフェスト属性がありません

ようやくJavaのプログラムが完成してIDE(NetBeans)外で動作させようとしたら

XXX.jarにメイン・マニフェスト属性がありません



う~ん。
とりあえずNetBeansのドキュメントの通りにやってみる。

netbeans_mf2.png
プロジェクトファイルの実行カテゴリでメインクラスを指定して保存。
再ビルドして、ファイルツリーで生成されたjarのノードを開いて、META-INFフォルダの下にあるMANIFEST.MFを開くと
netbeans_mf1.png

Main-Class: xxxx.xxx


という行が追加されて・・・いる筈がいないんですよね・・・
NetBeansのバグ??
直接ファイルを開いて、追記しろって事なのかな?

Eclipseだと簡単に出来るみたいなんですけど、NetBeansは癖が強いのかな?
慣れない環境での作業は次から次へと障害が現れますね、まぁ一つ一つ対処して慣れるしか無いんですけどね。

JNAを用いてJava(NetBeans)からdllが見つけられなかった時

emotionサイトトップ > NetBeans >JNAを用いてJava(NetBeans)からdllが見つけられなかった時

Javaのプログラムでdllを使用して、C++のプログラムと連携させるには、
JNA(Java Native Access)をインポートしなければならないのですが、プログラムを実行すると・・・
DLL_64bitJDK1.png

指定されたモジュールが見つかりません。


と表示されて、場所を変更したりしても何故かdllが見つからない・・・
dllは他ソフトからアクセス出来ていたので、dll自体は問題無さそうなのですが・・・
dllの動作をチェックしたソフトは32bitものだったんですよね。
dll自体も32bitのコンパイラで作成したので・・・もしかして!?

インストール済みのJDKをチェックしてみると
DLL_64bitJDK2.png
JDKが64bitでしたw
64bitのJDKをアンインストールして、
32bitのJDKをダウンロードして実行したら・・・
dllはちゃんと見つけられて動作しました。

JDKが64bitだった事に気がつくのに小一時間かかりました。
朝からdll絡みの不具合調査していたら、あっという間にお昼になってましたw
まぁ解決できず丸一日潰れた上に解決出来ないよりはマシですけどねw

NetBeans(MinGW) C++でDLL作成

emotionサイトトップ > NetBeans >NetBeans(MinGW) C++でDLL作成

NetBeansで作成したDllを使用すると、Dll内の関数が見つかりませんってエラーが出てお手上げです。
64bitでビルドして32bitのソフトで使用したとかじゃありませんよ
(いえ・・・最初64bitアーキテクチャのMinGWのコンパイラでビルドしてしまいましたけど、実行時のエラーコードで気がついて32bitのMinGWに変更してビルドし直しましたw)

Dllの中身はチェック出来ないので、ここで躓くとハマってお手上げに・・・
と、思ったら、

Dependency Walker
http://www.dependencywalker.com/

というツールが有りましたw
dependencywalker.png
便利ですね~dllファイルを開くと、dll内の関数名が表示されていました。
それが分かった所でデバッグが出来ないdllの不具合を見つけるのはやっぱりハマります・・・
関数名が壊れている場合は.defファイルを作成して、プロジェクト設定のリンカ―入力のモジュール定義ファイルに作成したdefファイルを指定してビルドすると解決するんですけどね。
違う開発環境で作成したソフトでdllを参照するとうまくエクスポートされていない時があるんですよね。

・・・やっぱり大人しくVisualStudioでビルドしようかな~w
ライセンス認証済みのPCが1台だけ残っているしw

――追記―――
解決しましたw
dllの関数名が壊れていました。
壊れていたというか、関数名の後に"@x"が付け加えられていました。引数無し関数には@0が、合計16byteの引数の関数には@16が付け加えられていました。
VisualStudioで作成したdllで、__declspec(dllexport) __stdcallを付けて更にdefファイルを作成してリンカー入力に指定してビルドしたdllは、関数名の最後に"@x"は付いていませんでした。

NetBeansでdefファイルをリンカー入力に指定したら済む話じゃん!!
でもプロジェクト設定にそんな設定はありません。
それっぽい名前のものはありましたが、ダメでしたw
netbeans_dll1.png
なので、gccオプションを使う事にしました。

-shared XXXX.def


を追加すれば良いだけですが、
"コンパイル行"の"追加のオプション"にdefファイル名を指定するだけで、勝手に-sharedオプションが付くみたいです。
ちなみに作成してdefファイルは直接ソースコードと同じフォルダに置きました。
NetBeans上ではdefファイルは指定出来ないので、直接フォルダに置きます。

作成し直したdllファイルをチェックすると
netbeans_dll2.png
"@x"の無い関数が作成されました。
"@x"が付いた関数も作成されてしまっていますが、とりあえず他ソフトから参照出来るようになりました。
"@x"が付いた関数は要らないので、ちゃんとするにはもうちょっと調べる必要がありますが、それはまた後日にw

MinGWでboolを使うとコンパイルエラー

emotionサイトトップ > NetBeans >MinGWでboolを使うとコンパイルエラー

C++の開発環境をVisualStudioからNetBeans + MinGWに移行して、
過去に作ったソースコードをそのまま持ってきてビルドしたら・・・

error: unknown type name 'bool'; did you mean '_Bool'?


ってコンパイルエラーが・・・
boolじゃなくて_Boolの間違いじゃない?って・・・

boolは実は後から導入された(C99で導入)もので、元々は無かったみたいですね。
なのでbool宣言しているstdbool.hをインクルードする必要があるみたいです。
Mingw_bool.png

NetBeans(IDE)でC++の開発環境を用意するメモ

emotionサイトトップ > NetBeans >NetBeans(IDE)でC++の開発環境を用意するメモ


WindwosでC++の開発環境を整えるなら、MicrosoftのVisual Studioの無償版を使用するのが手っ取り早いのですが、
マイクロソフトのアカウントにサインインして認証の手続きが必要です。
問題なのがマイクロソフトのアカウントはしばらくするとアカウント停止になってSMSで再認証する必要があります。

マイクロソフトアカウントが一時的に使用停止[大量に迷惑メールを送信したか、サービス規約に違反]


スポンサーリンク





SMSを受信できるモバイルを持っていない人は二度とそのアカウントは使える事は無いので、フリーのメールアドレスを取得して新しいアカウントを作成して認証しなければなりません。
PCが壊れたりHDDを交換したりでOSを再インストールしたりする度にそんな事を繰り返すのは大変です。

なので認証に煩いマイクロソフトじゃなくて、総合開発環境のNetBeansを使用する事にしました。
NetBeansは元々Javaの開発環境として使用していたので、そのままC++の開発環境に使えたら便利だと思ったので・・・

https://netbeans.org/downloads/?pagelang=ja
netbeans_c04.png
元々Javaしか使っていなかったので、C++が含まれているインストーラーをダウンロードしてインストールし直しです。

ちなみにNetBeansはEclipseと違ってコンパイラが同梱されていないみたいです。

なのでコンパイラを別途入手してインストールする必要があります。

という事で必要なコンパイラ類

Cygwin
MinGW
MSYS



Cygwinはインストールするものを選択出来るので、必要なものだけ選択してインストールします。
Cygwin01.png
量が多いので、ViewのリストでCategoryを選択して、カテゴリ別表示にして、Develのツリーを開きます。

Cygwin02.png
Develのツリーから、コンパイラ関連のgcc全部とgdbを選択します。(私はついでにWindowsAPI絡みのツールも選択しました)。
左のSkipをクリックしてバージョン指定すると、指定したバージョンがインストールされます。
Skip表示のものはインストールされません。


MinGWは64bitの開発環境をインストール時にアーキテクチャを"x86_64"に変更する事を忘れずに。
32bitの開発環境をインストール場合はアーキテクチャを"i686"にします。
(現在使用しているOSでは無く、ソフトが32bitか64bitのどちらで生成するかです。当然64bitの開発環境でビルドしたソフトは32bitOSの環境では動作しません。)
32bitと64bitの両方をインストールするには、別々にインストールしてインストール先フォルダを分けておきます。

MSYSはインストールでは無く7zファイルを展開するだけなので、ファイルを置いた場所を忘れずに!
またMinGWにmakeファイルが無いのでMSYSが必須になります。

コンパイラ類をインストールしたらNetBeansを起動して、
メニューバー → ツール → オプション
を選択します。
netbeans_c01.png
C/C++のアイコンを選択して、ビルド・ツールのタブを選択して、アクティブ化ボタンをクリックします。

netbeans_c02.png
ツールコレクションの下にある追加ボタンを押して

netbeans_c03.png
ベースディレクトリにMinGWをインストールしたフォルダの下にあるbinフォルダを選択します。


netbeans_c05.png
ツールコレクションファミリにGNU MinGWを選択します。

netbeans_c06.png
各コンパイラにMinGWのファイルを設定します。
makeコマンドはMSYSのファイルを設定します。
(Windowsの環境変数のPATHにMinGWフォルダとMSYSフォルダを追加しておくと、ベースディレクトリ設定時に自動で各コンパイラが選択されます)。

とりあえずこれでNetBeansでC++のプロジェクトをビルド出来る環境が出来ました。
gccとかmakeって・・・Linuxみたいですね。
てゆかCygwinのサイトに
Get that Linux feeling - on Windows
と記載されていたので、Linuxのgccベースのコンパイラなのかな??

細かい内容は別途追記する予定です。
とりあえずVisualStudioから脱して違う開発環境を急いで整えただけですw

---追記---
さっそく適当にメインファイルを作ってビルドしてみると
Cygwin03.png
う~んエラーが、後ろにエラーの内容が出ていたのですが、文字化けしていて解読不可能でした。
出力されていた文字自体が壊れているみたいで、文字エンコードを変えても解読不可能でした。
色々試した結果、解決しなかったのですが、エラー内容をよく見ると

Cannot run program "C:\Program"


Program Files (x86)フォルダにインストールしたのにProgramで切れている・・・
多分、コマンドラインでパスやフォルダやファイルを指定する際に空白があると切れてしまうので、空白がある場合はダブルクォーテーション("")で括る必要があるのですが、NetBeansが実行している部分なのでこちらからはどうしようも無い・・・
とりあえずインストール先を"c:\Compiler"に変更して再インストールしたら、上手く行きました。
ここで無駄に時間を費やしました。

ついでにWindowsの環境変数追加について。
コントロールパネル → システムとセキュリティ → システムで
左側にあるツリーから"システムの詳細設定"をクリック。
Cygwin06.png

詳細設定タブを選択して環境変数ボタンをクリック。
Cygwin05.png
XXX(ユーザー名)のユーザー環境変数に既にPATH変数が存在する場合は、PATHを選択して編集ボタンをクリック。
PATH変数が無い場合は、新規ボタンをクリックして、PATH変数を追加。

値の設定は編集ボタンを押した時に表示されるウインドウで行った方が簡単です。
Cygwin04.png
”環境変数名の編集”ウインドウで新規ボタンを押して、
MinGWのインストールフォルダ配下のbinフォルダと、MSYSのインストールフォルダ配下のbinフォルダを追加します。

スポンサーリンク
カテゴリ
OS (5)
Web (7)
CPU (16)
GPU (35)
GA2 (2)
GTA5 (18)
リンク
Unreal Engine
UE4_logo.png

無料化したゲームエンジンです。ミドルレンジクラスのGPUが必須ですが、GTX750Tiでも軽快に動作します。
ueHow
unityHow
Steam
steam.png
Valve Corporationが運営しているプラットフォームで、PCゲームをダウンロード購入出来ます。 不定期ながらだいたい四半期毎と10月の米国感謝祭と年末に大幅割引セールが行われるので、セール中に購入するのがおススメ。
RSSリンクの表示


スポンサーリンク