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

わんくま同盟

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

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

ツリー一括表示

こんなヘッダーファイルって困りますね /熊本 (17/05/09(Tue) 11:24) #84012
Re[1]: こんなヘッダーファイルって困りますね /とっちゃん (17/05/09(Tue) 11:35) #84014
  └ Re[2]: こんなヘッダーファイルって困りますね /774RR (17/05/09(Tue) 13:41) #84017
    └ Re[3]: こんなヘッダーファイルって困りますね /熊本 (17/05/10(Wed) 09:46) #84023
      ├ Re[4]: こんなヘッダーファイルって困りますね /とっちゃん (17/05/10(Wed) 10:44) #84026
      └ Re[4]: こんなヘッダーファイルって困りますね /774RR (17/05/10(Wed) 10:34) #84025


親記事 / ▼[ 84014 ]
■84012 / 親階層)  こんなヘッダーファイルって困りますね
□投稿者/ 熊本 (1回)-(2017/05/09(Tue) 11:24:00)

分類:[C/C++] 


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

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

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

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


[ □ Tree ] 返信 編集キー/

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


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

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

[ 親 84012 / □ Tree ] 返信 編集キー/

▲[ 84014 ] / ▼[ 84023 ]
■84017 / 2階層)  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 に訂正のうえ例示など

[ 親 84012 / □ Tree ] 返信 編集キー/

▲[ 84017 ] / ▼[ 84026 ] ▼[ 84025 ]
■84023 / 3階層)  Re[3]: こんなヘッダーファイルって困りますね
□投稿者/ 熊本 (2回)-(2017/05/10(Wed) 09:46:29)
inline関数の話良く分かりました。

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


[ 親 84012 / □ Tree ] 返信 編集キー/

▲[ 84023 ] / 返信無し
■84026 / 4階層)  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

[ 親 84012 / □ Tree ] 返信 編集キー/

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

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

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

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

わざわざ提示するほどの内容でもない、5分もあれば作れるよ。
[ 親 84012 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -