Я на RHEL 6 с gcc версии 4.1.2.
Я столкнулся с точно такой же проблемой, как описано в этом посте. Разница лишь в том, что я сталкиваюсь с этой проблемой для переменной области файла. (Переменная объявлена вне класса, но в файле, так что она будет доступна для двух-трех функций. И эта переменная удаляется дважды, даже если я объявил в стеке)
c ++ linux двойное уничтожение статической переменной. символы ссылок перекрываются
В моем приложении похожая ситуация.
static library "slib"
-- inside this library, there is static object "sobj"
dynamic library "dlib"
-- links staticly "slib"
executable "exe":
-- links "slib" staticly
-- links "dlib" dynamicly
Подозреваю, я тоже столкнулся с той же проблемой. Для проверки мне нужно придумать команду g ++, которая будет собирать файлы описанным выше способом. Я попытался выполнить следующие команды, но он не воспроизводит указанное поведение.
g++ -Wall -c static_lib.cpp
ar -cvq libtests.a static_lib.o
g++ -Wall -fPIC -c dynamic_lib.cpp
g++ -shared -Wl,-soname,libtestd.so.1 -o libtestd.so.1.0 dynamic_lib.o -L. libtests.a
ln -s libtestd.so.1.0 libtestd.so
g++ -Wall -I. -L. main_exe.cpp -ltestd -ltests -o main_prog
Я не уверен, правильно ли я связал файлы или нужным образом. Но это не производит дефект, который я хочу наблюдать. Например, моя версия исполняемого файла выводит следующие данные.
user:~/problem$ ./main_prog
CTest() this=134520880
use
use
~CTest() this=134520880, is Alive
Где файл make, созданный с помощью cmake, выдает следующие данные.
user:~/problem$ ./main_exe
CTest() this=134520880
CTest() this=134520880
use
use
~CTest() this=134520880, is Alive
~CTest() this=134520880, is Dead
Не могли бы вы помочь добиться того же эффекта. Я попытался запустить makefile -n для печати команд, но он не печатает все команды и останавливается после построения динамической библиотеки.
Любые входы будут оценены.
Обновить:
Я использовал 'make VERBOSE = 1' и наблюдал за выполнением следующих команд. Я не знаю, почему используется -rdynamic, но мы используем то же самое в нашем приложении. Пожалуйста, найдите команды, выполняемые ниже.
/usr/bin/c++ -fPIC -c static_lib.cpp
/usr/bin/ar cr libstatic_lib.a static_lib.o
/usr/bin/ranlib libstatic_lib.a
/usr/bin/c++ -fPIC -c dynamic_lib.cpp
/usr/bin/c++ -fPIC -shared -Wl,-soname,libdynamic_lib.so -o libdynamic_lib.so dynamic_lib.o libstatic_lib.a
/usr/bin/c++ -fPIC -c main_exe.cpp
/usr/bin/c++ main_exe.o -o main_exe -rdynamic libstatic_lib.a libdynamic_lib.so -Wl,-rpath,/home/amey/c_examples/cmake
Кроме того, тесты в нм показали, что символ имеет разные значения.
desktop:~/c_examples/cmake$ nm libdynamic_lib.so |grep _ZN5CTest4testE
0000000000201048 B _ZN5CTest4testE
desktop:~/c_examples/cmake$ nm main_exe |grep _ZN5CTest4testE
0000000000602048 B _ZN5CTest4testE
desktop:~/c_examples/cmake$ nm libstatic_lib.a |grep _ZN5CTest4testE
0000000000000000 B _ZN5CTest4testE
Итак, два главных вопроса поднимаются в моей голове?
1) Почему есть два конструктора? Даже если есть два конструктора, почему они указывают на один и тот же объект
2) Есть ли проблема с последовательностью компиляции?