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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

extern "C"を使っているのはCPPファイルですか?


またextern "C"が何をするか理解されていますか?

extern "C"の意味を理解なされていないのであれば素直に諦めるか拡張子をCPPで統一してProjectに登録した方が楽でしょう。

C++では関数名に引数の種類や個数の情報を付与し、オーバーロードを実現します。
extern "C"はその後に続く定義関数のlinkage命名方法をCと同じ命名規約で名前付けします。
つまりその中にオーバーロードした関数などがあると(命名規約が変わり一意に関数が特定できないため)旨くリンクできなくなる可能性があります(実際に試した事はないんでどうなるかは不明ですが)。

なのでc拡張子のファイルをcppにするだけでも命名規約はCPPにそろうため旨く動くはずです。

どうしてもextern "C"を使うのであればMSDNの
VisualC++ドキュメント-VisualC++ユーザーズガイド-VisualC++プログラマーズガイド-プログラム機能の追加-詳細-混合言語によるプログラミング-C++を使った混合言語によるプログラミング
を読みましょう。
    • good
    • 0

コンパイラから実態が見えていないだけなのでは?



きちんと外部コール関数は定義されていますか?
⇒ヘッダーや"*.def"等のファイル。
    • good
    • 0

VC++と言う事ですが、


cファイルを既存のC++のワークスペースに取り込みたいんですよね?
⇒"c"ファイルの拡張子を"cpp"に変更して普通に組み込めませんか?
それとも逆をしようとしているのですか?

※エラー箇所がわかっているなら原因はわかると思うので、
 修正の方向ではだめなのですか?

この回答への補足

元々はCで作成したDLLとCPPで作成したDLLと別ファイルだったのですが、
呼び元の問題でDLLを1つにまとめたいとのことでチャレンジしています。
当初は安易に全ソース取り込みDLLを作成すればできると考えていた
のですが、外部宣言のextern "C"と記述するとエラーが発生してしまいます。(Cファイルがあるから?)
"C"をはずせばDLLは作成できるのですが、DLL内を見ると外部関数名に"?"がついてしまいます。
拡張子だけ変えれば済む問題なのでしょうか?

補足日時:2001/12/06 15:54
    • good
    • 0

コンパイラは何を使用しているのですか?

この回答への補足

説明不足ですみません・・VC++6.0です。

補足日時:2001/12/06 15:00
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QVisual C++でDLLを使いたいのですが、どう宣言したらよいのでしょうか?

Visual C++でDLLを使いたいのですが、どう宣言したらよいのでしょうか? またDLLは何処に入れればよいのでしょうか?
DLLはMFCで書かれています。
ご教示願います。

Aベストアンサー

libがないとリンクは出来ないでしょう
LoadLibraryとGetProcAddressを使ったサンプルです。
#include <windows.h>
#include <stdio.h>

HINSTANCE hDll;
long ( __stdcall *fft1dim)(
long,
double,
double*,
double*,
long,
long,
double,
double
);

int main(void)
{
hDll = LoadLibrary("CalFFT.dll");
if( ! hDll ){
printf("DLL load error");
return 1;
}

fft1dim = (long(__stdcall*)(
long,
double,
double*,
double*,
long,
long,
double,
double)
) GetProcAddress( hDll, "fft1dim");
if( !fft1dim ){
FreeLibrary( hDll );
printf("Get function error");
return 2;
}
printf("OK!");
FreeLibrary( hDll );
return 0;
}

libがないとリンクは出来ないでしょう
LoadLibraryとGetProcAddressを使ったサンプルです。
#include <windows.h>
#include <stdio.h>

HINSTANCE hDll;
long ( __stdcall *fft1dim)(
long,
double,
double*,
double*,
long,
long,
double,
double
);

int main(void)
{
hDll = LoadLibrary("CalFFT.dll");
if( ! hDll ){
printf("DLL load error");
return 1;
}

fft1dim = (long(__stdcall*)(
long,
double,
double*,
double*,
long,
long,
double,
double)
) GetProcAddres...続きを読む

Q構造体の入れ子が構造体の場合のextern宣言について

えーと、題名の通りで、単に構造体の場合はextern出来たのですが、構造体の入れ子が構造体の場合は上手くextern出来ないのです;;;

typedef struct __test001 {

int arg;

} _test001;


typedef struct _body {

_test001 test001;

} body;

body useful;

この場合、他のファイル(例えばtest.cpp)でusefulを使いたい場合、どのようにexternさせれば宜しいでしょうか?

Aベストアンサー

とりあえず、
-------------
typedef struct __test001 {

int arg;

} _test001;


typedef struct _body {

_test001 test001;

} body;

/*↓注意*/
extern body useful;
------------------

を、「何とか.h」というファイルにしておいて、
使いたいコードの最初の方で

#include "何とか.h"

とincludeさせておきます。

そして、プログラム全体で一箇所

body useful;

と宣言します。
これで何とか.hをインクルードしたソースでは
変数usefulが使えるようになっているはずです。

QDLLを直接プログラム内に取り込んでEXEファイルを作れますか

VC++.NETで開発を行う予定ですが、
そのときicmp.dllというDLLを使う予定です。
これに関する説明を読むと、将来サポートされない可能性があるとのことでした。
それで、このDLLをスタティックライブラリをリンクするように、EXE本体のなかに取り込んでおきたいのですが、そのようなことは、出来るのでしょうか。
つまり、icmp.dllのある環境で、exeファイルを作り、
icmp.dllのない環境で、そのexeファイルを実行させたいのですが、そのようなことはできるのでしょうか。

Aベストアンサー

ここで検索してみましたが
"質問:libファイル無しでかつLoadLibraryを使わずにロードする方法"
がみつかりました
>VC++.net
お使いのvisual C++は2002,2003,2005
かとおもいますが
手元のかんきょう(2003)ではコマンドは確認しました
lib
dumpbin

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=964346

QVisual C++ Toolkitでcppをコンパイルすると・・

最近質問が多くてすみません。
一応調べてみましたが、同じような質問が既存ならば警告お願いします。

#include <iostream>
int main(){
return 0;
}

これだけのファイルを、例えばtest.cppとして保存します。そして
cl test.cpp
とすると、ぶわーっと警告(warning)がでて、しかしtest.exeができあがります。
警告内容がかなり長いので、そのうちの1つを載せます。
C:\Program Files\Microsoft Visual C++ Toolkit 2003\include\stdexcept(39) : see reference to class template instantiat
ion 'std::basic_string<_Elem,_Traits,_Ax>' being compiled
with
[
_Elem=char,
_Traits=std::char_traits<char>,
_Ax=std::allocator<char>
]

意味がわかりません!!
ちなみに、bccでは警告なしにコンパイルできます。

最近質問が多くてすみません。
一応調べてみましたが、同じような質問が既存ならば警告お願いします。

#include <iostream>
int main(){
return 0;
}

これだけのファイルを、例えばtest.cppとして保存します。そして
cl test.cpp
とすると、ぶわーっと警告(warning)がでて、しかしtest.exeができあがります。
警告内容がかなり長いので、そのうちの1つを載せます。
C:\Program Files\Microsoft Visual C++ Toolkit 2003\include\stdexcept(39) : see reference to class template instantiat
ion '...続きを読む

Aベストアンサー

-GX を指定して下さい。と書かれていませんか?

cl -GX test.cpp

Qmain.cpp以外のcppの追加について

VisualC++を使用し、プログラムを作っています。
そこでプログラムを整理しようと思うのですが、
main.cpp以外もcppを作成し、プログラムを分割することが可能ですよね?
cppファイル自体は作ることができるのですが、
作った後どのようにしてmain文から呼び出し?をするのか具体的なことがわかりません。

どのようなワードで検索が引っ掛かるのかもわからないので
掲載しているHP、もしくはやり方を教えてください。

私自身理解が足りていないので、
説明もあやふやなものになっていますがよろしくお願いします。

Aベストアンサー

参考まで…。

http://blog.livedoor.jp/tek_koc/archives/50198846.html


人気Q&Aランキング

おすすめ情報