下記コードをビルド中、下記リンカエラーが出てしまい その解決方法を伺いたく質問させて頂きました。
■コード
[ t.hpp ]
struct C
{
static int m;
static void f();
};
[ a.cpp ]
#include "t.hpp"
__thread int C::m;
[ b.cpp ]
#include "t.hpp"
void C::f(){ m = 0; }
void main(){}
■リンカエラー
C::m: TLS definition in a.obj section .tbss mismatches non-TLS reference in Debug/b.obj
(静的メンバ変数C::mは a.cppでTLSとして定義されたけど、C::mを参照しているb.cppでは、非TLS扱いだから合わないよ!)
■試した事
・t.hppのstatic int m; に、__threadを付加 → 付けないのと同じ扱いだった
・a.cppのコードをb.cppに統合したらOK → __thread変数の定義部と参照部を同じファイルにすると良さそう。が、会社の政治的な理由で不可...
■環境
ある組み込み環境でのGCC4.0.2
一日中試しましたが惨敗でした。ファイル構成を変えずにTLSの静的メンバ変数が使える方法をお教え頂けないでしょうか。どうか宜しくお願い致します。
No.1ベストアンサー
- 回答日時:
__threadって初めてみるので、勉強を兼ねてサンプルを書きました。
以下のような感じでコンパイルは通りました。
環境はgcc version 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
■test.h
#ifndef __TEST_H_
#define __TEST_H_
struct C {
static __thread int m;
static void f();
};
#endif
■main.cpp
#include "test.h"
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void C::f() {
m++;
printf("id = %d: m = %d\n", pthread_self(), m);
}
void * func(void *arg)
{
sleep(1);
C::f();
}
int
main()
{
pthread_t tid0, tid1;
pthread_create(&tid0, NULL, func, NULL);
pthread_create(&tid1, NULL, func, NULL);
pthread_join(tid0, NULL);
pthread_join(tid1, NULL);
}
■main2.cpp
#include "test.h"
__thread int C::m = 0;
■実行結果
id = 1084726192: m = 1
id = 1093114800: m = 1
(それぞれのスレッドでm++しているが、値は1)
質問者さんのソースがどうなっているのかよくわかりませんが、
参考になりますでしょうか。
カスタム版GCCの修正担当者が、バグを仕込んでしまったようです。
別の版(新旧)を試したら、問題がおきませんでした。
ので、修正を待つ事に致します。どうも有難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
既定のコンストラクタがありま...
-
【gcc・cygwin】multiple defin...
-
ダウンキャストを行うoperator...
-
Notepad++の関数リスト表示の変...
-
C++ strlenに関して
-
多重定義が起きている?--lnk20...
-
ウインドウの移動禁止
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
C++にてtemplateで受け取った任...
-
const_castのつかいどころを教...
-
リージョンのフレームを描画す...
-
C言語 コードを書いたのですが...
-
C# KeyDownイベントでショート...
-
openglの法線ベクトルについて
-
「Aに対するBの割合」と「Aに対...
-
「指定されたキャストは有効で...
-
信頼区間の1.96や1.65ってどこ...
-
c言語でのfscanfについて
-
プログラミング初心者です。 Py...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
静的でないメンバ関数の呼び出...
-
C++にてtemplateで受け取った任...
-
戻り値を返す関数の前に(void)...
-
多重定義が起きている?--lnk20...
-
既定のコンストラクタがありま...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
int main()、void main()、void...
-
const_castのつかいどころを教...
-
C# KeyDownイベントでショート...
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
C#でラジオボタンを設定に記録...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
_beginthreadにて発生するコン...
-
ウインドウの移動禁止
-
コールバックって・・・
-
構造体を宣言と共に初期化する方法
おすすめ情報