c ++ двойное удаление переменных области видимости файлов? - PullRequest
1 голос
/ 11 ноября 2011

Я на 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) Есть ли проблема с последовательностью компиляции?

1 Ответ

0 голосов
/ 11 ноября 2011

Чтобы получить список команд, которые выполняются cmake, запустите make clean && make -DVERBOSE=1 или установите VERBOSE в среде, надеюсь, это поможет повторить проблему. Чтобы ответить, почему переменная дважды инициализирована / уничтожена, слишком мало данных.

...