C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: こんなヘッダーファイルって困りますね


(過去ログ 143 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■84012 / inTopicNo.1)  こんなヘッダーファイルって困りますね
  
□投稿者/ 熊本 (1回)-(2017/05/09(Tue) 11:24:00)

分類:[C/C++] 


いまある有名のライブラリーを使って開発をしていますが、

このライブラリーに付随するヘッダーファイルを異なるC言語ソースファイルにincludeしたら、
必ず「重複生成」というLINKエラーが発生します。

調べたら、これらのヘッダーファイルに関数コードが含まれている原因だと分かりました。

どうすればいいのでしょうか。


引用返信 編集キー/
■84014 / inTopicNo.2)  Re[1]: こんなヘッダーファイルって困りますね
□投稿者/ とっちゃん (433回)-(2017/05/09(Tue) 11:35:45)
No84012 (熊本 さん) に返信
>
> いまある有名のライブラリーを使って開発をしていますが、
>
> このライブラリーに付随するヘッダーファイルを異なるC言語ソースファイルにincludeしたら、
> 必ず「重複生成」というLINKエラーが発生します。
>
> 調べたら、これらのヘッダーファイルに関数コードが含まれている原因だと分かりました。
>
> どうすればいいのでしょうか。
>
>
どんなライブラリかわかりませんが、使い方は間違っていないんですよね?


お手軽に済ませるなら、該当部分をエラーが出ないように修正してしまうことだと思います。
具体的な内容がわからないので、どう修正すればいいかはわかりませんけど。

後は作者に連絡してエラー修正方法を問い合わせるとかですかね。

引用返信 編集キー/
■84017 / inTopicNo.3)  Re[2]: こんなヘッダーファイルって困りますね
□投稿者/ 774RR (517回)-(2017/05/09(Tue) 13:41:25)
2017/05/09(Tue) 14:03:29 編集(投稿者)
C89 と C++03 では inline 関数をヘッダに書いたときの挙動が異なるので

C : inline 関数が重複してますエラーが発生
C++ : 正常にリンクできる (inline 展開された結果重複しない)
なんてのは結構よくある質問だったりする。

C++ 専用ヘッダを C ソースにて #include するとこうなるので C++ ソースにすると直ったりとか。
$ gcc -O3 inlinetest1.c inlinetest2.c testmain.c
_func1 が重複して うんぬん
$ gcc -O3 -std=gnu99 inlinetest1.c inlinetest2.c testmain.c
$ /*成功終了とか*/

まあ何にせよ詳細がわからないと答えようが無いはとっちゃん (さん略) と同意見。

C99 での inline の扱いは調査しきれてないので C89 に訂正のうえ例示など

引用返信 編集キー/
■84023 / inTopicNo.4)  Re[3]: こんなヘッダーファイルって困りますね
□投稿者/ 熊本 (2回)-(2017/05/10(Wed) 09:46:29)
inline関数の話良く分かりました。

ところが、実装コードを入れたヘッダーファイルの多所includeによって引き起こされる「関数の多重定義」LINKエラーに関して対策皆無と考えてよろしいでしょうか。
他人LIBヘッダーの修正は怖いんで。


引用返信 編集キー/
■84025 / inTopicNo.5)  Re[4]: こんなヘッダーファイルって困りますね
□投稿者/ 774RR (518回)-(2017/05/10(Wed) 10:34:17)
「有名な」ライブラリなら名前を公開しても問題ない、んでね?
そしたらオイラたちでもいろいろ検証できるかもしれないし。

> 対策皆無
オイラのコメントはその「対策」のつもりだったんだけど?

C++ 流儀の inline を C で使おうとすると inline 関数が重複するエラー発生

gcc の場合 GNU 拡張を有効、かつ、最適化有効にすれば対策できることがある
コンパイルオプション -std=gnu99 -O2 あたりを指定するとうまくいく例を、オイラの手元で作れた。
ってことで。

わざわざ提示するほどの内容でもない、5分もあれば作れるよ。
引用返信 編集キー/
■84026 / inTopicNo.6)  Re[4]: こんなヘッダーファイルって困りますね
□投稿者/ とっちゃん (434回)-(2017/05/10(Wed) 10:44:14)
No84023 (熊本 さん) に返信
> inline関数の話良く分かりました。
>
> ところが、実装コードを入れたヘッダーファイルの多所includeによって引き起こされる「関数の多重定義」LINKエラーに関して対策皆無と考えてよろしいでしょうか。
> 他人LIBヘッダーの修正は怖いんで。
>
>
そのライブラリなるものがどんなものなのかわからないし、詳細がわからないので何とも言えないというのは私も書いてるし、774RRさんも書いてます。

inline が原因なのだとすれば、本来 C++向けに提供されているライブラリを C から使っているという可能性もあります。
その場合は、拡張子を .cpp にすれば解決すると思います(ほかのエラーが出るとは思いますけどねw)。

また、実は、インクルードファイルの使い方に問題があって、関数を定義する場所と宣言を利用する場所とを分けるために
#include "hogehoge.h" と書く前に、#define なんたらかんたら と入れなきゃいけないなんてお呪いがあるかもしれません。

ほかにも考えられる可能性はいろいろあると思いますが、何をどうやってるのかわからない現状では
「鼻から悪魔が出てきても文句は言えない」という程度くらいしか助言できないです。

C言語ってそういうものですからw

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -