ページ 1 / 1
CからPerlを実行したい
Posted: 2010年9月05日(日) 13:44
by Shota
タイトルの通りです。
http://www.magicvox.net/archive/categor ... _10221914/
このサイトに書いてあるとおりに実行してみたところ、以下のようなエラーがでました。
エラー E2303 C:\Perl\lib\CORE\win32.h 368: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32.h 369: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32.h 370: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32.h 371: 型名が必要
エラー E2293 C:\Perl\lib\CORE\win32.h 474: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 117: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 118: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 121: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 123: ) が必要
エラー E2141 C:\Perl\lib\CORE\perlio.h 124: 宣言の構文エラー
エラー E2293 C:\Perl\lib\CORE\perlio.h 125: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 218: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 231: ) が必要
エラー E2303 C:\Perl\lib\CORE\perlio.h 343: 型名が必要
エラー E2303 C:\Perl\lib\CORE\perlio.h 346: 型名が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 349: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 358: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 362: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 369: ) が必要
エラー E2293 C:\Perl\lib\CORE\perlio.h 374: ) が必要
エラー E2303 C:\Perl\lib\CORE\win32iop.h 73: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32iop.h 74: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32iop.h 77: 型名が必要
エラー E2303 C:\Perl\lib\CORE\win32iop.h 134: 型名が必要
エラー E2238 C:\Perl\lib\CORE\perl.h 2398: 'AV' の宣言が複数見つかった
エラー E2228 C:\Perl\lib\CORE\perl.h 2398: エラーあるいは警告が多すぎる
ActivePerlのヘッダファイルですが、全くいじってないのに何故このようなエラーがでるのでしょうか?
環境
OS:Windows XP
コンパイラ:bcc55
Re:CからPerlを実行したい
Posted: 2010年9月05日(日) 14:04
by naohiro19
COREフォルダに入っているperlXXX.libの番号はいくつですか?
Re:CからPerlを実行したい
Posted: 2010年9月05日(日) 14:08
by Shota
512です。
Re:CからPerlを実行したい
Posted: 2010年9月06日(月) 13:03
by ookami
naohiro19さんの書き込みを見て思ったのですが、
>
http://www.magicvox.net/archive/categor ... _10221914/
> #pragma comment(lib, "perl56.lib")
とあるので、パスが違うだけとかありますか?
# bccってpragmaいけましたっけ?
# と思ったら、5.5からはサポートされてるんですね; 失礼しました。
Re:CからPerlを実行したい
Posted: 2010年9月06日(月) 20:12
by Shota
#pragma comment(lib, "perl512.lib")
にして試してみましたが同様のエラーがでます。
Re:CからPerlを実行したい
Posted: 2010年9月07日(火) 00:07
by naohiro19
borland\bcc55\Binのbcc32.cfgに
以下に変更します
デフォルトでは
-I"c:\Borland\Bcc55\include"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK"
となっているので
-I"c:\Borland\Bcc55\include;[COREまでのフルパス];"
-L"c:\Borland\Bcc55\lib;c:\Borland\Bcc55\lib\PSDK;[COREまでのフルパス];"
に変更します。
Re:CからPerlを実行したい
Posted: 2010年9月07日(火) 19:24
by Shota
>>naohiro19
既に完了しています。
インクルードファイルが見つからないなどのエラーでなく、インクルードファイル自体のエラーなのです。
Re:CからPerlを実行したい
Posted: 2010年9月08日(水) 12:17
by ookami
あとは、まったくのカンですが、
どこかで
class {
ほにゃらら
}
↑「;」忘れ
とかないですか?
こうなったらソースをまとめてアップしてもらうのが
一番確実な気がします。
Re:CからPerlを実行したい
Posted: 2010年9月08日(水) 21:17
by Shota
ソースは
http://www.magicvox.net/archive/categor ... _10221914/
このサイトに書いてある通りのソースです。
インクルードファイルは編集してないのですが、
win32.h
win32iop.h
perlio.h
perl.h
エラーメッセージのでているこれらを貼ればよいのでしょうか?
Re:CからPerlを実行したい
Posted: 2010年9月08日(水) 22:33
by ookami
あ、そのリンク先の「だけ」なんですね。
うーん、解決しませんか。
> エラー E2303 C:\Perl\lib\CORE\win32.h 368: 型名が必要
↑みたいに、一見win32.hでエラーになっているようでも、
#include "win32.h" の前の行のミス(;つけ忘れとか)に引っ張られてるんじゃと思ったんですけどね…
あとは、そのperlモジュールをダウンロードする時、VC++用とBCC用が違ったなんてことは…?
Re:CからPerlを実行したい
Posted: 2010年9月08日(水) 23:11
by たろ
こんな↓ブログ記事を見つけました。BCCに対応していないということかも?
http://harapeko.asablo.jp/blog/2006/11/22/964430
(引用)
・BCC32 では Perl/lib/CORE/win32.h のコンパイルが (相変わらず) 通らない。(深刻な問題: C ソースは
MS-VC++ のみに対して調整されているか、またはそもそもちゃんと整理されていない)
Re:CからPerlを実行したい
Posted: 2010年9月09日(木) 06:53
by toyo
コンパイルが通ってもVC++用の~.libはBccでは使えないんじゃないでしょうか
Re:CからPerlを実行したい
Posted: 2010年9月09日(木) 17:44
by ISLe
BCC55だといくつかの型(というかマクロ)が定義されないようです。
#プリプロセッサで避けられてる。
Re:CからPerlを実行したい
Posted: 2010年9月09日(木) 18:58
by Shota
つまりbccでは無理なんですねorz
VC++を入れるしか回避方法はないのでしょうか?
Re:CからPerlを実行したい
Posted: 2010年9月09日(木) 23:52
by Shota
VC++からコンパイルしてみました。
Microsoft Visual C++ 2010を普通に起動すると操作がガタガタになるので
(RAM:248MBの環境ではストレス感じまくり)
Visual Stadio コマンドプロンプト (2010)
から実行してみました。
cl test.c /I C:\Perl\lib\CORE
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
test.c
c:\perl\lib\core\win32.h(368) : error C2143: 構文エラー : ')' が '*' の前にあり
ません。
c:\perl\lib\core\win32.h(368) : error C2081: 'Stat_t' : 仮パラメーター リスト内
の名前が正しくありません。
c:\perl\lib\core\win32.h(368) : error C2143: 構文エラー : '{' が '*' の前にあり
ません。
・
・
・(文字数制限のためカット)
・
・
c:\perl\lib\core\win32iop.h(73) : error C2059: 構文エラー : ')'
c:\perl\lib\core\win32iop.h(74) : error C2143: 構文エラー : ')' が '*' の前にあ
りません。
c:\perl\lib\core\win32iop.h(74) : fatal error C1003: プログラム内のエラーが 100
個を超えました。コンパイルは中断されます。
これは更に酷い…。
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 01:38
by ISLe
perlembed - C プログラムに perl を埋め込む
http://fleur.hio.jp/perldoc/mix/pod/perlembed.html
↑のページによるとperl -Vを実行してccflagsに表示されるコンパイルオプション(特にマクロ定義)を指定する必要があるみたいです。
VC2010Expressでコンパイルが通るところまでは確認できましたけどリンクエラーが出ました…。
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 06:37
by toyo
VisualC++のIDEからならコンパイルもリンクもできますね
コンパイルはWIN32と_CONSOLEを定義すればどうでしょう
cl -DWIN32 -D_CONSOLE ~
ただ実行時エラーになりました
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 09:38
by へろりくしょん
BCCからどうにか出来ないかがんばってみましたが、ちょっとどうにもあきらめました。
VisualStudio .NET 2003 コンパイル・リンク・実行まで上手くいきましたよ。
空のコンソールアプリのプロジェクトを作成し、プロジェクトのプロパティからライブラリ・インクルードディレクトリを追加した以外一切の設定はいじってません。
ソースコードもNo:61299のサイトのソースのまんまです。
追記です。
プロジェクトのプロパティから見れるオプションです。
/Od /I "D:\Compiler\perl\lib\CORE" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"Debug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP

Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 17:08
by Shota
C:\Documents and Settings\Owner\My Documents\c++>cl test.c /Od /I "C:\perl\lib\C
ORE" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"De
bug/" /Fd"Debug/vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されてい
ません。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '/MLd' を無視します
cl : コマンド ライン warning D9028 : 簡易リビルド時のエラーです、通常のビルドに
戻します
test.c
c:\documents and settings\owner\my documents\c++\test.c : fatal error C1033: プ
ログラム データベース 'c:\documents and settings\owner\my documents\c++\debug\vc
70.pdb' を開けません。
データベースって何やねんorz
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 17:28
by へろりくしょん
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 17:50
by Shota
ありがとうございます。
修正してからコンパイルしてみました。
C:\Documents and Settings\Owner\My Documents\c++>cl test.c /Od /I "C:\perl\lib\C
ORE" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Gm /EHsc /RTC1 /MLd /Fo"./
" /Fd"./vc70.pdb" /W3 /nologo /c /Wp64 /ZI /TP
cl : コマンド ライン warning D9035 : オプション 'Wp64' の使用は現在推奨されてい
ません。今後のバージョンからは削除されます。
cl : コマンド ライン warning D9002 : 不明なオプション '/MLd' を無視します
test.c
c:\perl\lib\core\sys\socket.h(34) : warning C4005: 'ENOTSOCK' : マクロが再定義さ
れました。
c:\program files\microsoft visual studio 10.0\vc\include\errno.h(120) :
'ENOTSOCK' の前の定義を確認してください
ENOTSOCKが再定義されているようなんですが、どうしたらいいのでしょう…。
名前を変えるわけにもいきませんよね。。
おそらくこれさえ解決できれば実行ファイルはできそうなのですが。。
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 20:29
by Shota
仕方が無いので、perlの実行ファイルを作成し、呼び出すことにしました。
file.exeと言うファイルに引数を渡して実行したくて、
Cのソースファイルに
system("file.exe test.txt");
と記述してコンパイルしました。
しかし、これを実行するとコマンドプロンプトに一瞬何かが表示されて消えてしまい、希望の動作をしません。
(file.exeは、渡された引数のファイルをオープンし、変換してkekka.txtに出力する)
(本当に一瞬なんでなんて表示されているかは分かりません。何度もキャプチャしようと思いましたが、タイミングが合わずキャプチャもできません。。)
file.exe単体で実行すると、kekka.txtが生成されて上手くいくのですが、Cで作ったexeから実行すると上手くいきません。
なぜでしょうか?
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 21:43
by Shota
原因がわかりました。
file.exeはオープンソースのテキストエディタを改造してそこからから呼び出しているのですが、
テキストエディタを起動して即、file.exeを実行すると成功します。
しかし、ファイルのオープンやセーブをしてからfile.exeを実行すると、file.exeが見つからず失敗します。
ファイルオープンやセーブをするとカレントディレクトリが変更されるのが原因だと思われます。
そこで、カレントディレクトリを変更する方法を調べ、
system("file.exe test.txt");の文の前に、
SetCurrentDirectory(file.exeのあるディレクトリ)
と記述しました。
しかし、やはり上手くいきません。
どうしたらよいのでしょうか?
Re:CからPerlを実行したい
Posted: 2010年9月10日(金) 23:52
by たろ
「file.exeのあるディレクトリ」がわかっているのであれば、
system("\"ディレクトリ\\file.exe\" \"ディレクトリ\\test.txt\"");
ではダメでしょうか・・?
Re:CからPerlを実行したい
Posted: 2010年9月11日(土) 00:07
by Shota
絶対パスで記述しても何故か動作してくれません…。
system("C:\Documents and Settings\Owner\デスクトップ\nedit004\src\file.exe C:\Documents and Settings\Owner\デスクトップ\nedit004\src\test.txt");
Re:CからPerlを実行したい
Posted: 2010年9月11日(土) 00:32
by たろ
ソース上もその記述のままだとたぶんダメです。
・\ は \\ と書く
・パスに空白文字がある時は、パス全体を \" と \" で括る
でどうでしょうか。1つ前の私のコメントの記述のようにしてみてください。
Re:CからPerlを実行したい
Posted: 2010年9月11日(土) 19:20
by Shota
system("\"C:\\Documents and Settings\\Owner\\デスクトップ\\nedit004\\src\\file.exe\" \"C:\\Documents and Settings\\Owner\\デスクトップ\\nedit004\\src\\test.txt\"");
としましたが、やはり認識してくれません。
Re:CからPerlを実行したい
Posted: 2010年9月11日(土) 21:37
by Shota
ところで、これでもしできたとしても他に重要な問題がありました。
たろさんの
>>「file.exeのあるディレクトリ」がわかっているのであれば、
というコメントを頂きましたが、よく考えたら分からない場合もあるかもしれません。
仮にプログラムを配布したとして、ダウンロード先のフォルダが人によって違えば絶対パスもかわるわけですよね…。
Re:CからPerlを実行したい
Posted: 2010年9月11日(土) 22:18
by たろ
あれ、ダメでしたか・・なんでだろう。
試しに、いまsystem()を実行しているついでに、
system("C:\\WINDOWS\\system32\\notepad.exe");
を書いて実行するとメモ帳が起動しますか?
※WindowsXPの場合なのでWindows7とか場所が違うかもしれません
起動するなら、あともう1つ日本語を含む適当なパス名で同じことをして問題ないかどうか。
以上の2つができるなら、原因は「file.exe か test.txt のパスが間違ってる」事だと思うのですが。
> 仮にプログラムを配布したとして、ダウンロード先のフォルダが人によって違えば絶対パスもかわるわけですよね…。
GetModuleFileName() 関数でプログラム(exe)自分自身のフルパスを取得できます。
file.exe との位置関係が分かれば file.exe のパスもわかると思います。
Re:CからPerlを実行したい
Posted: 2010年9月12日(日) 18:47
by Shota
アドバイスをもとに
試行錯誤していたらできました。
どこかが間違っていたようですね;;
fileには
C:\Documents and Settings\Owner\デスクトップ\nedit004\src\sample.txt
という値が入っています。
sprintf(buf,"\"C:\Documents and Settings\Owner\デスクトップ\nedit004\src\compile.exe\" %s",file);
として
system(buf);
としています。
すると確かにプログラムが起動するのですが、
perl側の受け取った引数が、
C:\Documents and Settings\Owner\デスクトップ\nedit004\src\sample.txt
となるはずなのに、
C:\Documents
となってしまいます。
何故でしょうか?
sprintf(buf,"\"C:\Documents and Settings\Owner\デスクトップ\nedit004\src\compile.exe\" %s",file);
を
sprintf(buf,"\"C:\Documents and Settings\Owner\デスクトップ\nedit004\src\compile.exe\" \"%s\"",file);
とするとコンパイルエラーになります
sprintf(buf,"\"C:\Documents and Settings\Owner\デスクトップ\nedit004\src\compile.exe\" '%s'",file);
としても、
C:\Documents
となってしまいます。
どうしたらいいでしょうか?
因みに、sprintfでbufに格納したあとに、bufの値をみてみると、確かに
"C:\Documents and Settings\Owner\デスクトップ\nedit004\src\compile.exe" C:\Documents and Settings\Owner\デスクトップ\nedit004\src\sample.txt
となっています。
Re:CからPerlを実行したい
Posted: 2010年9月12日(日) 19:11
by Shota
原因がわかりました。
どうやらスペースで引数が区切られてしまっていたようです。
連結したら上手くいきました。
協力してくださったみなさま、ありがとうございました!
Re:CからPerlを実行したい
Posted: 2010年9月12日(日) 19:35
by Shota
最後に
sprintf(buff,"notepad ファイル名")
で変換後の内容を表示しようとしたら、ちゃんとnotepadが起動され、ファイルも開けるのですが、
一緒にコマンドプロンプトが起動してしまいます。
どうしたらコマンドプロンプトが起動しなくてすむでしょうか?
Re:CからPerlを実行したい
Posted: 2010年9月12日(日) 19:51
by シエル
system関数からやってたら仕方ないんじゃないですかね?
WINAPI使って、CreateProcessから直接叩くしかないんじゃないですか?
まあ、あんまり詳しくないんで間違ってたらすいません。
Re:CからPerlを実行したい
Posted: 2010年9月12日(日) 20:05
by Shota
ありがとうございます。
CreateProcessで成功しました。