質問: 3; @library.hpp void printmsg(); @library.cpp #include #include "const.hpp" void printmsg() { printf("X is %d\n", X); } ### Terminalで実行 g++ -fPIC -shared -o libprint.so library.cpp cp libprint.so /usr/lib/ @user_main.cpp #include "const.hpp" int main(void) { printmsg(); return 0; } ### Terminalで実行 g++ test.cpp -lprint ``` この時、最後のtest.cppのコンパイル直前で const.hpp の X の値を書き換えても ./a.outをして表示されるのは X is 3 ですよね。 これをうまくヘッダファイルを書き換えて実行結果が(ここではXの値が)変わるように出来たりしないでしょうか。 見当違いの質問かもしれませんが、よろしくお願いいたします。 以上
回答: Linuxの共有オブジェクト(.so)はグローバル変数も普通に共有できます。 ご質問のような使い方であれば、パラメーター用のヘッダーには`const int X = 3;`ではなく`extern int X;`とやって(ヘッダー名はconst.hppではなく、param.hppのようにした方が判りやすいかも)、main関数を記述したソースの中で`int X = 3;`と書けば、library.hppを再コンパイルすることなく変更が反映されます。 `int X = 3;`の記述は、param.cppのように別ソースにするとより管理しやすいでしょう。その際、param.cppをリンクするのはmain側です。