CからPerlを実行したい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Shota

CからPerlを実行したい

#1

投稿記事 by Shota » 15年前

タイトルの通りです。
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

naohiro19

Re:CからPerlを実行したい

#2

投稿記事 by naohiro19 » 15年前

COREフォルダに入っているperlXXX.libの番号はいくつですか?


ookami

Re:CからPerlを実行したい

#4

投稿記事 by ookami » 15年前

naohiro19さんの書き込みを見て思ったのですが、
> http://www.magicvox.net/archive/categor ... _10221914/
> #pragma comment(lib, "perl56.lib")

とあるので、パスが違うだけとかありますか?

# bccってpragmaいけましたっけ?
# と思ったら、5.5からはサポートされてるんですね; 失礼しました。

Shota

Re:CからPerlを実行したい

#5

投稿記事 by Shota » 15年前

#pragma comment(lib, "perl512.lib")
にして試してみましたが同様のエラーがでます。

naohiro19

Re:CからPerlを実行したい

#6

投稿記事 by naohiro19 » 15年前

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までのフルパス];"
に変更します。

Shota

Re:CからPerlを実行したい

#7

投稿記事 by Shota » 15年前

>>naohiro19
既に完了しています。

インクルードファイルが見つからないなどのエラーでなく、インクルードファイル自体のエラーなのです。

ookami

Re:CからPerlを実行したい

#8

投稿記事 by ookami » 15年前

あとは、まったくのカンですが、

どこかで
class {
ほにゃらら
}
↑「;」忘れ
とかないですか?

こうなったらソースをまとめてアップしてもらうのが
一番確実な気がします。

Shota

Re:CからPerlを実行したい

#9

投稿記事 by Shota » 15年前

ソースは
http://www.magicvox.net/archive/categor ... _10221914/
このサイトに書いてある通りのソースです。

インクルードファイルは編集してないのですが、
win32.h
win32iop.h
perlio.h
perl.h
エラーメッセージのでているこれらを貼ればよいのでしょうか?

ookami

Re:CからPerlを実行したい

#10

投稿記事 by ookami » 15年前

あ、そのリンク先の「だけ」なんですね。

うーん、解決しませんか。

> エラー E2303 C:\Perl\lib\CORE\win32.h 368: 型名が必要

↑みたいに、一見win32.hでエラーになっているようでも、
#include "win32.h" の前の行のミス(;つけ忘れとか)に引っ張られてるんじゃと思ったんですけどね…

あとは、そのperlモジュールをダウンロードする時、VC++用とBCC用が違ったなんてことは…?

たろ

Re:CからPerlを実行したい

#11

投稿記事 by たろ » 15年前

こんな↓ブログ記事を見つけました。BCCに対応していないということかも?
http://harapeko.asablo.jp/blog/2006/11/22/964430
(引用)
・BCC32 では Perl/lib/CORE/win32.h のコンパイルが (相変わらず) 通らない。(深刻な問題: C ソースは
 MS-VC++ のみに対して調整されているか、またはそもそもちゃんと整理されていない)

toyo

Re:CからPerlを実行したい

#12

投稿記事 by toyo » 15年前

コンパイルが通ってもVC++用の~.libはBccでは使えないんじゃないでしょうか

ISLe

Re:CからPerlを実行したい

#13

投稿記事 by ISLe » 15年前

BCC55だといくつかの型(というかマクロ)が定義されないようです。
#プリプロセッサで避けられてる。

Shota

Re:CからPerlを実行したい

#14

投稿記事 by Shota » 15年前

つまりbccでは無理なんですねorz


VC++を入れるしか回避方法はないのでしょうか?

Shota

Re:CからPerlを実行したい

#15

投稿記事 by Shota » 15年前

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
個を超えました。コンパイルは中断されます。


これは更に酷い…。

ISLe

Re:CからPerlを実行したい

#16

投稿記事 by ISLe » 15年前

perlembed - C プログラムに perl を埋め込む
http://fleur.hio.jp/perldoc/mix/pod/perlembed.html

↑のページによるとperl -Vを実行してccflagsに表示されるコンパイルオプション(特にマクロ定義)を指定する必要があるみたいです。
VC2010Expressでコンパイルが通るところまでは確認できましたけどリンクエラーが出ました…。

toyo

Re:CからPerlを実行したい

#17

投稿記事 by toyo » 15年前

VisualC++のIDEからならコンパイルもリンクもできますね
コンパイルはWIN32と_CONSOLEを定義すればどうでしょう
cl -DWIN32 -D_CONSOLE ~
ただ実行時エラーになりました

へろりくしょん

Re:CからPerlを実行したい

#18

投稿記事 by へろりくしょん » 15年前

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

画像

Shota

Re:CからPerlを実行したい

#19

投稿記事 by Shota » 15年前

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を実行したい

#20

投稿記事 by へろりくしょん » 15年前

プログラムデータベースに関しては、下記のサイトをご参照ください。

http://msdn.microsoft.com/ja-jp/library/9wst99a9(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/cc398380.aspx

なお、オプションに含まれるパスは環境に合わせて適時読み替えてくれると幸いです。

Shota

Re:CからPerlを実行したい

#21

投稿記事 by Shota » 15年前

ありがとうございます。
修正してからコンパイルしてみました。

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が再定義されているようなんですが、どうしたらいいのでしょう…。
名前を変えるわけにもいきませんよね。。
おそらくこれさえ解決できれば実行ファイルはできそうなのですが。。

Shota

Re:CからPerlを実行したい

#22

投稿記事 by Shota » 15年前

仕方が無いので、perlの実行ファイルを作成し、呼び出すことにしました。

file.exeと言うファイルに引数を渡して実行したくて、

Cのソースファイルに
system("file.exe test.txt");

と記述してコンパイルしました。
しかし、これを実行するとコマンドプロンプトに一瞬何かが表示されて消えてしまい、希望の動作をしません。
(file.exeは、渡された引数のファイルをオープンし、変換してkekka.txtに出力する)
(本当に一瞬なんでなんて表示されているかは分かりません。何度もキャプチャしようと思いましたが、タイミングが合わずキャプチャもできません。。)

file.exe単体で実行すると、kekka.txtが生成されて上手くいくのですが、Cで作ったexeから実行すると上手くいきません。
なぜでしょうか?

Shota

Re:CからPerlを実行したい

#23

投稿記事 by Shota » 15年前

原因がわかりました。

file.exeはオープンソースのテキストエディタを改造してそこからから呼び出しているのですが、
テキストエディタを起動して即、file.exeを実行すると成功します。

しかし、ファイルのオープンやセーブをしてからfile.exeを実行すると、file.exeが見つからず失敗します。

ファイルオープンやセーブをするとカレントディレクトリが変更されるのが原因だと思われます。

そこで、カレントディレクトリを変更する方法を調べ、

system("file.exe test.txt");の文の前に、

SetCurrentDirectory(file.exeのあるディレクトリ)

と記述しました。
しかし、やはり上手くいきません。
どうしたらよいのでしょうか?

たろ

Re:CからPerlを実行したい

#24

投稿記事 by たろ » 15年前

「file.exeのあるディレクトリ」がわかっているのであれば、

system("\"ディレクトリ\\file.exe\" \"ディレクトリ\\test.txt\"");

ではダメでしょうか・・?

Shota

Re:CからPerlを実行したい

#25

投稿記事 by Shota » 15年前

絶対パスで記述しても何故か動作してくれません…。

system("C:\Documents and Settings\Owner\デスクトップ\nedit004\src\file.exe C:\Documents and Settings\Owner\デスクトップ\nedit004\src\test.txt");

たろ

Re:CからPerlを実行したい

#26

投稿記事 by たろ » 15年前

ソース上もその記述のままだとたぶんダメです。

・\ は \\ と書く
・パスに空白文字がある時は、パス全体を \" と \" で括る

でどうでしょうか。1つ前の私のコメントの記述のようにしてみてください。

Shota

Re:CからPerlを実行したい

#27

投稿記事 by Shota » 15年前

system("\"C:\\Documents and Settings\\Owner\\デスクトップ\\nedit004\\src\\file.exe\" \"C:\\Documents and Settings\\Owner\\デスクトップ\\nedit004\\src\\test.txt\"");


としましたが、やはり認識してくれません。

Shota

Re:CからPerlを実行したい

#28

投稿記事 by Shota » 15年前

ところで、これでもしできたとしても他に重要な問題がありました。

たろさんの
>>「file.exeのあるディレクトリ」がわかっているのであれば、
というコメントを頂きましたが、よく考えたら分からない場合もあるかもしれません。

仮にプログラムを配布したとして、ダウンロード先のフォルダが人によって違えば絶対パスもかわるわけですよね…。

たろ

Re:CからPerlを実行したい

#29

投稿記事 by たろ » 15年前

あれ、ダメでしたか・・なんでだろう。
試しに、いまsystem()を実行しているついでに、

system("C:\\WINDOWS\\system32\\notepad.exe");

を書いて実行するとメモ帳が起動しますか?
※WindowsXPの場合なのでWindows7とか場所が違うかもしれません

起動するなら、あともう1つ日本語を含む適当なパス名で同じことをして問題ないかどうか。

以上の2つができるなら、原因は「file.exe か test.txt のパスが間違ってる」事だと思うのですが。


> 仮にプログラムを配布したとして、ダウンロード先のフォルダが人によって違えば絶対パスもかわるわけですよね…。

GetModuleFileName() 関数でプログラム(exe)自分自身のフルパスを取得できます。
file.exe との位置関係が分かれば file.exe のパスもわかると思います。

Shota

Re:CからPerlを実行したい

#30

投稿記事 by Shota » 15年前

アドバイスをもとに
試行錯誤していたらできました。
どこかが間違っていたようですね;;


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

となっています。

Shota

Re:CからPerlを実行したい

#31

投稿記事 by Shota » 15年前

原因がわかりました。
どうやらスペースで引数が区切られてしまっていたようです。
連結したら上手くいきました。

協力してくださったみなさま、ありがとうございました!

Shota

Re:CからPerlを実行したい

#32

投稿記事 by Shota » 15年前

最後に
sprintf(buff,"notepad ファイル名")
で変換後の内容を表示しようとしたら、ちゃんとnotepadが起動され、ファイルも開けるのですが、
一緒にコマンドプロンプトが起動してしまいます。

どうしたらコマンドプロンプトが起動しなくてすむでしょうか?

シエル

Re:CからPerlを実行したい

#33

投稿記事 by シエル » 15年前

system関数からやってたら仕方ないんじゃないですかね?

WINAPI使って、CreateProcessから直接叩くしかないんじゃないですか?

まあ、あんまり詳しくないんで間違ってたらすいません。

Shota

Re:CからPerlを実行したい

#34

投稿記事 by Shota » 15年前

ありがとうございます。

CreateProcessで成功しました。

閉鎖

“C言語何でも質問掲示板” へ戻る