3

投稿に従って、Standalone functions/data in C++、以下のように「共通データ」を匿名名前空間に配置し、VS 2005/2008/2010 の Windows (Vista 64 ビット) ですべてがうまく機能しました。

namespace {
  ...
  static std::string mystrings[] = {
     str1,
     str2,
     ...,
     strN
  };
  ...
}

namespace mynamesp {
   ...
   use mystrings[] here..
   ...
}

しかし、Linux (GCC-4.1.2 でビルドされた RHEL5 のテスト済み) では、すぐにセグメンテーション エラーが発生しました。

$>myprog 
Segmentation fault
$>gdb myprog 
GNU gdb Fedora (6.8-27.el5)
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu"...
(gdb) r
Starting program: <path/to>/myprog 
[Thread debugging using libthread_db enabled]
[New Thread 0x2b8901a9da60 (LWP 32710)]

Program received signal SIGSEGV, Segmentation fault.
0x0000003e4ce9c928 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string ()
   from /usr/lib64/libstdc++.so.6
(gdb) bt
#0  0x0000003e4ce9c928 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string ()
   from /usr/lib64/libstdc++.so.6
#1  0x00002b88ffde482b in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535)
    at <path/to>/mysource.cpp:140
#2  0x00002b88ffde4d65 in global constructors keyed to _ZN91_GLOBAL__N__underscore_separated_path_to_mysource.cpp_00000000_6994A7DA2_1E () at <path/to>/mysource.cpp:12139
#3  0x00002b890011a296 in __do_global_ctors_aux ()
   from <path/to/libs>/debug/libmylibd.so
#4  0x00002b88ffcd7f33 in _init () from <path/to/libs>/debug/libmylibd.so
#5  0x00002b8901672e40 in ?? ()
#6  0x000000326940d22b in call_init () from /lib64/ld-linux-x86-64.so.2
#7  0x000000326940d335 in _dl_init_internal () from /lib64/ld-linux-x86-64.so.2
#8  0x0000003269400aaa in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#9  0x0000000000000001 in ?? ()
#10 0x0000000000000000 in ?? ()
(gdb)

バックトレース コール スタック アイテム #1 の 140 行目は、基本的に文字列定義の配列の末尾を指しています。他の人がこのエラーを受け取るのを見てきました。しかし、明らかな修正はありません。いつものように、考え/アイデア/修正を感謝します. ありがとう!

4

2 に答える 2

7

あなたの問題は、静的な初期化順序の失敗に関連している可能性があります。

これは、別の静的変数を使用して静的変数を初期化するときに発生します。後者がまだ初期化されていない場合、最初の変数は初期化に初期化されていない変数を使用しています。

根本的な原因は、静的変数が初期化される順序が定義されていないことです。

さらに読む: https://isocpp.org/wiki/faq/ctors#static-init-order

一般的な回避策は、静的変数を関数内にラップすることです。例:

T& GetStaticA() {
  T static_var_A; // <--initialization here
  return A;
}

T static_var_B = GetStaticA(); // <-- static_var_A is guaranteed to be initialized
于 2015-12-22T08:36:58.050 に答える
0

私はこの問題を抱えており、コンパイル行でリンクの最終出力ファイルを見逃していたことが判明しました。

g++ main.o logger.o timer.o keyboard.o -o main -lSDL -lSDL_image -lSDL_ttf -Wall

になるはずだった

g++ main.o logger.o timer.o keyboard.o drawer.o -o main -lSDL -lSDL_image -lSDL_ttf -Wall

(現在 drawer.o が含まれていることに注意してください?)

私の実際の bash コンパイル スクリプトにはさらに多くの行が含まれていたため、見逃しがちでした。

于 2013-02-24T18:02:08.687 に答える