• 締切済み

複数のCのみファイルをリンクし一本の実行ファイルまたはDLLを作成する方法

ykkw_2001の回答

  • ykkw_2001
  • ベストアンサー率26% (267/1014)
回答No.2

>初心者 とは、WindowsのMS-VisualStudio6.0が初めてであって、ほかのOSやC言語の開発環境は、「知っている」という感じですね。 で、すでにあるCソース(複数ファイル)をリンクして、Winで動作させたい。 と見ました。 (違ったらゴメン) DOSやUNIXのような、CUIの開発環境でmakefileを使っていた人には、あのような統合環境は「いったい何を勝手にやってくれているのか?」がわからなくて、「ちゃんとした説明があれば、自分でできるのに」と、とっつきにくいです。 私は、以前上記のようなことをやりましたので、その方法を・・・ まず、拡張子CPPのファイルの中にC言語ソースプログラムを書いても何ら問題ありませんので、認識してください。 >空の「シンボルを作成する」にしなければいけないのでしょうか?  しなくてもいいですが、サンプルコードが作成されますので、参考にしやすいです。 「シンボルをエクスポートする」で、プロジェクトを作成、既存のCファイルを拡張子Cppにして、ワークスペースのファイルビュー(ファイルがツリー状態で表示されている)のソースファイルのところで右クリック、cppファイルを追加してゆきます。 エクスポートするための定義が(xxx.h)の中に(XXX_APIのような形で)defineされてありますので、外部から利用したいシンボルの前につけます。 xxx.cpp のサンプルどおりにすればよい。 特にDLLの初期化や終了時のコードがなければ、xxx.cppは、ほうっておく。 このファイルにプログラムを書いてもいいが、既存のファイルであれば、その必要はないですね。 >網羅する場合はプロトタイプ宣言を外部ヘッダファイルに記述するのでしょうか?  全部のシンボルを外部利用可能にするなら、全部につけます。プロトタイプ宣言は、その関数が使われる前であれば、外部ヘッダファイルでなくてもよい。(MSCと同じです)。まぁ、外部ヘッダファイルのほうが、管理しやすいと思いますが・・・ >そのサンプルと言うか、詳しく掲載しているサイトがあったら教えてください。  これは、ANo.#1のitohh さんの回答がいいと思います。 あとは、プロジェクトをビルドすると、コンパイル&リンクされ、プロジェクトの設定で指定した場所にDLLファイルが作成されますので、外部プログラムから、変数や関数を利用できます。 #ちなみにVC6.0 は、MSCバージョン12です。統合環境でなくても、Winアプリを作成できます。 #あの統合環境が嫌いで、エディタでソースを書いて、DOS窓でmake(nmake)している人や、 #自分流で使いやすいGUIのツールを作ってしまった人(↓)もいます。

参考URL:
http://www.arcpit.co.jp/apmake_0.htm

関連するQ&A

  • ヘッダファイルを使わずに定義する方法

    新しい関数を使ったソースを古いOSでコンパイルすると、外部シンボル...Aが未解決になります。 ヘッダファイルでその関数のプロトタイプを書くとコンパイル可能になると思いますがヘッダファイルを使わずに*.cppにプロトタイプを書くようなことは可能ですか? __declspec(import) DWORD Win7OnlyEx(LPTSTR);

  • プリコンパイル済みヘッダー ファイルを作成はどこ?

    VisualStudio(以下VS)2010にて、プリコンパイル済みヘッダー ファイルを作成するが見つかりません。 どこにあるのでしょうか? VS2008だと、プロパティ > プリコンパイル済みヘッダーにあるのを確認しています。 MSDNを見るとプロパティにあると書いてあるのですが、書いてある場所にはありません。 そもそもプリコンパイルのやり方が変わったりしたのでしょうか? どこに移動したのか教えていただきたいです。よろしくお願いします。

  • DLLでLIBファイルが作成されない

    DLLを作るプログラムをしているのですが、どうしてもコンパイル時にLIBファイルが作成されません。 1>warning C4091: '__declspec(dllexport)' : 変数が何も宣言されていないときは、'DDDClass' の左辺を無視します。 と警告が出てしまいます。 私が書いたソースは以下の通りで、クラスとそのメンバをEXPORTしたいのです。ここで、最後のコメントを外して有効にするとLIBファイルが作成されることはわかっています。また、クラスのメンバにEXPORTをつけてもオーバーライトだと怒られてしまいます。 どのようにしたらLIBファイルが作成されるようになるのでしょうか? ■■■stub.h■■■ #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif typedef int (*HOGEHOGE)(int i); EXPORT class DDDClass{ private: int num; HOGEHOGE c; public: DDDClass(); int CALLBACK counter(); int CALLBACK touroku(int (*b)(int i)); }; ■■■stub.cpp■■■ #include <windows.h> #include "Stub1.h" int WINAPI DllMain(HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ return true; } EXPORT class DDDClass; DDDClass::DDDClass(){ num =0; c = NULL; } int CALLBACK DDDClass::touroku(int (*b)(int i)){ c = b; return 0; } int CALLBACK DDDClass::counter(){ //c = b; c(num); num++; return 0; } /* EXPORT bool CALLBACK aaaaa(){ return true; } */

  • CファイルとCPPファイルのDLL作成

    CファイルとCPPファイルを同一DLLに取り込むことは可能でしょうか?もし可能であれば実現方法も教えて頂きたいのですが。 現状は別DLLを作成しているのですが、両ファイルを取り込んでビルドすると外部関数宣言をしている箇所がエラーになってしまいます。(extern "C"の箇所が・・・)

  • C++のdllの作り方を教えてください。

    こんにちは。 先週、「UNIXのC++で共通クラスを作りたい。」って言う質問をした orange_pieと申します。 そのバージョンアップ質問として、作成した共通クラスをDLLにして みんなに提供したいのですが、コンパイルはアーカイブを作る時と どう違うのでしょうか? ちなみに、コンパイルした後でarコマンドを使ってアーカイブを作っていました。 % gcc -c aaa.cpp % ar -r libaaa.a aaa.o dllを作るには、ヘッダーファイルの記述に何か特別なものが必要ですか? また、できあがったdllを使う側では、ヘッダーファイルをインクルードして LIBパスの通ったところにdllを入れておけば良いのでしょうか? どなたか教えてください。

  • dllファイルの作成手順

    今回初めてVisualStudio C++ にて作業しています。 初歩的な事を聞いてしまっているかもしれませんが、宜しくお願いします。 【環境】 WinXP SP3,VisualStudio2008 【目的】 InstallShield2009にて、カスタムアクションであるプロセスが 起動されているか否か(ロックファイル有無)の判定をしたいのです。 InstallShieldのサポートより指南頂いた回答は、 PSAPI.dll に含まれる PSAPI ライブラリを使用する方法でした。 【行った操作】 http://support.microsoft.com/kb/175030/ja http://www.networld.co.jp/is/pdf/tips/tips5.pdf まずは新アクションの追加を試みようと、下段リンク先にあります 手順に従いC++テンプレートでのCustomActionの作成をしました。 VisualStudio2008を起動し、 新しいプロジェクト>Visual C++>空のプロジェクト と選択。 C:\CustomActionにプロジェクト「CustomAction」を新規作成。 プロジェクト(P)>CustomActionのプロパティ>Release>リンカ 「$(OutDir)\$(ProjectName).exe」を 「$(OutDir)\$(ProjectName).dll」に書き換える。 ソースファイルからCustomAction.cppとCustomAction.defを新規作成。 CustomAction.cppとCustomAction.defは、 リンク先URLのサンプルコードと同じものです。 ビルドによってできたdllを用いて、URL先資料2/5ページ以降の 手順書通りにmslを作成するも、出来上がったmsiは 実行後即、異常終了するものでした。 何処かに手順ミスがあるのは間違いないのですが、 InstallShieldの操作の方は何度も見直していますので ミスがあるとしたらdllの作成で何処か間違えがあるのではと思い、質問いたします。 InstallShieldと言う、公になっているノウハウの少ないツールがらみではありますが、宜しくお願いします。

  • 初心者です。VisualStudioについて教えてください。(C++)

    初心者です。VisualStudioについて教えてください。(C++) VisualStudioのWindowsフォームプロジェクトを作成すると 「Form1」という簡易画面が自動で作成されます。 その画面にボタン等を追加していくと、そのボタン押下時の処理が 「Form1.h」にどんどん追加されていきます。 なぜヘッダファイルに処理の実装を記述していくのでしょうか? 基本的に、ヘッダとは関数やクラスを定義するだけのもので 実装はcppファイルに記述していくものだと研修等で教わったのですが。 なぜなのでしょう? ご教授下さい。 また、「Form1.h」ではなく「*.cpp」ファイルに実装を記述したい場合 どうのようにすればよいのでしょうか?

  • VisualStudio2005でのDLL作成

    開発環境 OS:WindowsXP SP2 SDK:VisualStudio2005 StandardEdition 言語:VC++ Win32コンソールアプリケーションのDLLを選択 空のプロジェクトを使用 作成したいのはVBなどから呼び出せるWin32DLLです。 他のホームページを参考にして以下のようなファイルを作成し ビルド->コンパイルしたところdllファイルはできましたが AccessVBAから参照設定ができませんでした。 どこを修正すればよいか教えてください。 <dlltest.cpp> #define EX __declspec (dllexport) #include <iostream> #include <windows.h> EX int fnWindowHook(void); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call){ case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } EX int hundred(){ return 100; } <dlltest.def> LIBRARY "dlltest1" EXPORTS disp @1

  • DLLファイルを分けたい

    Win2K VC++ 6.0 でDLLを作成しています。 現在DLLの関数が多すぎて作業しにくいですが、 3つに分けたいですが可能でしょうか。 Test.def Test.h Test.cpp Test.defの中身  FunA FunB FunC FunD FunE FunF FunA,FunB ==> A.CPP FunC,FunD ==> B.CPP FunE,FunF ==> C.CPP にしたいですが、方法がわかりません。

  • Visual Studio で実行ファイルが作れません

    C言語の勉強のため、VisualStudio2005standard を初めて使い始めましたが、ビルドできたのに実行ファイルができません。 ファイル→新しいプロジェクト→プロジェクトの種類→VCC++→win32→コンソールアプリケーション→プロジェクト名の入力→アプリケーションの設定→完了 このように操作したら、ソースフォルダの下に拡張子 .cpp のC++のひな形ができたので、それにソースを書いて、拡張子を .c に替えて保存し、ビルドしたらエラーはありませんでした。 しかし、オブジェクトファイルまたは実行ファイルは作成されていず、メニューの実行コマンドも無効の表示で、実行できませんでした。 操作の誤り、何らかの設定の必要があればご指摘いただきたいです。 よろしくお願いします。