

下記コードをビルド中、下記リンカエラーが出てしまい その解決方法を伺いたく質問させて頂きました。
■コード
[ 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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マルチメディアタイマー
-
const_castのつかいどころを教...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
【gcc・cygwin】multiple defin...
-
既定のコンストラクタがありま...
-
TimerProc コールバック関数を...
-
int main()、void main()、void...
-
定義した文字列を wchar_t 系の...
-
qsortの引数について
-
組み込みマイコン
-
マルチメディアタイマーの使用方法
-
スレッドの作成について(pthre...
-
DirectInput でのエラー
-
VC++でGetKeyboardStateがうま...
-
void*型の配列について
-
c言語 引数のvoidについて
-
C++にてtemplateで受け取った任...
-
C#でテンキーの操作は可能でし...
-
多重定義が起きている?--lnk20...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
多重定義が起きている?--lnk20...
-
const_castのつかいどころを教...
-
C++にてtemplateで受け取った任...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
静的でないメンバ関数の呼び出...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
C# Controls.Addで動的に配置し...
-
(void)0 はどんな意味ですか
-
gcc: incompatible pointer type
-
_beginthreadにて発生するコン...
-
C#でラジオボタンを設定に記録...
-
C#でテンキーの操作は可能でし...
-
C++別のオブジェクトからメンバ...
-
CTabCtrl:TABインデックス単位...
-
見た目は同じソースなのにエラ...
-
pictureboxの画像を削除するには?
-
【VC++6.0】イベントハンドラ関...
おすすめ情報