2012-11-06 3 views
2

Я пытаюсь скомпилировать следующий C++ код, который реализует контекст дерева Switching (More info on the download page):подталкивания :: ошибка системы ссылка на Ubuntu

Zip archive, 0.2 MB

, который требует некоторых библиотек подталкивания. Я загружаю последнюю версию с сайта boost.org и строю все библиотеки, которые необходимо построить, следуя инструкциям на веб-сайте. Я также модифицировал make-файл, включенный в архив, чтобы добавить путь повышения lib и boost_system, но я все еще получаю сообщение об ошибке. Вот Makefile я использую:

PROGRAM = cts 
SOURCES = $(wildcard *.cpp) 
OBJECTS = $(SOURCES:.cpp=.o) 
CFLAGS = -Wall 
LDFLAGS = -lboost_program_options -lboost_filesystem -lboost_system 

$(PROGRAM): $(OBJECTS) Makefile 
    g++ $(CFLAGS) -L/home/users/mnembrini/opt/boost/lib $(LDFLAGS) -o $(PROGRAM) $(OBJECTS) 

# Include known dependecies from -MMD 
#-include $(OBJECTS:.o=.d) 

%.o: %.cpp 
    g++ -MMD $(CFLAGS) -I/home/users/mnembrini/opt/boost/include -c $< 

clean: 
    rm -f $(OBJECTS) *.d 

.PHONY: clean 

где импульс находится в ~/Opt/импульс (constains Lib и включают в подкаталог). И вот связующая ошибка:

[email protected]:~/src/cts-v1 $ make 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c ac.cpp 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c cts.cpp 
cts.cpp: In member function ‘virtual void SwitchingTree::update(bit_t)’: 
cts.cpp:402:12: warning: variable ‘snc’ set but not used [-Wunused-but-set-variable] 
cts.cpp: In member function ‘virtual double SwitchingTree::prob(bit_t)’: 
cts.cpp:432:12: warning: variable ‘snc’ set but not used [-Wunused-but-set-variable] 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c ctw.cpp 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c icsilog.cpp 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c main.cpp 
g++ -MMD -Wall -I/home/users/mnembrini/opt/boost/include -c PowFast.cpp 
g++ -Wall -L/home/users/mnembrini/opt/boost/lib -lboost_program_options -lboost_filesystem -lboost_system -o cts ac.o cts.o ctw.o icsilog.o main.o PowFast.o 
cts.o: In function `__static_initialization_and_destruction_0(int, int)': 
cts.cpp:(.text+0x1743): undefined reference to `boost::system::generic_category()' 
cts.cpp:(.text+0x174f): undefined reference to `boost::system::generic_category()' 
cts.cpp:(.text+0x175b): undefined reference to `boost::system::system_category()' 
ctw.o: In function `__static_initialization_and_destruction_0(int, int)': 
ctw.cpp:(.text+0xfcf): undefined reference to `boost::system::generic_category()' 
ctw.cpp:(.text+0xfdb): undefined reference to `boost::system::generic_category()' 
ctw.cpp:(.text+0xfe7): undefined reference to `boost::system::system_category()' 
main.o: In function `showHelp()': 
main.cpp:(.text+0x1c): undefined reference to `boost::program_options::operator<<(std::basic_ostream<char, std::char_traits<char> >&, boost::program_options::options_description const&)' 
main.o: In function `initOptions(int, char**, boost::program_options::variables_map&)': 
main.cpp:(.text+0x10f): undefined reference to `boost::program_options::options_description::add_options()' 
main.cpp:(.text+0x129): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, char const*)' 
main.cpp:(.text+0x13e): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
main.cpp:(.text+0x153): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
main.cpp:(.text+0x166): undefined reference to `boost::program_options::options_description_easy_init::operator()(char const*, boost::program_options::value_semantic const*, char const*)' 
main.cpp:(.text+0x1d6): undefined reference to `boost::program_options::store(boost::program_options::basic_parsed_options<char> const&, boost::program_options::variables_map&, bool)' 
main.cpp:(.text+0x200): undefined reference to `boost::program_options::notify(boost::program_options::variables_map&)' 
main.o: In function `__static_initialization_and_destruction_0(int, int)': 
main.cpp:(.text+0x1f13): undefined reference to `boost::system::generic_category()' 
main.cpp:(.text+0x1f1f): undefined reference to `boost::system::generic_category()' 
[snip (2-3 screens like above)] 
collect2: ld returned 1 exit status 
make: *** [cts] Error 1 

Я использую GCC 4.6.3 на Ubuntu 12.04 64bit.

ответ

5

Поместите все библиотеки после всех объектных файлов в командной строке. Порядок здесь важен, в отличие от некоторых других операционных систем.

+0

Спасибо, что сделал! Есть ли причина, почему это так? –

+0

Фактически, с неявными правилами по умолчанию, он работает с 'LDLIBS = -lboost_program_options -lboost_filesystem -lboost_system 'вместо' LDFLAGS = ' –

0

Вам нужно (как и ранее сообщалось n.m) убедиться, что у вас есть правильный порядок соединения. В основном некоторые реализации заботятся о том, какой заказ вы связываете с объектом, но также и с библиотеками.

Если вы связываете библиотеку, которая еще не указана предыдущим кодом, она будет отброшена. Я помню, придумывая решение взломать в разных (версиях) библиотек в программе, ссылаясь на тот же символ, но в объекте, связанного после первого, а затем повторно связать другую версию библиотеки:

-lyourprojwantingv1 -llibraryofv1 -lyourprojwantingv2 -llibraryofv2 

Лично я думаю, это все просто безумие! (Все это!)

Смежные вопросы