2011-05-08 3 views
1

Я написал программу в C++, используя файлы заголовков из boost. Когда я скомпилировал его, я заметил, что у меня есть некоторые неопределенные символы для повышения системы и повышения файловой системы (что я ожидал). Я, наконец, получил свою компиляцию и ссылку на программу, но я, вероятно, не понимаю, почему. Если бы кто-то мог дать некоторое представление о следующем, я бы оценил это.Boost C++ статические пути ссылок под cygwin

Окончательное утверждение компиляции является: G ++ dcc_to_png.c -lboost_system-MT -lboost_filesystem-м , но глядя на повышающего/состояние/Библиотека имен библиотеки, перечисленные в/cygdrive/C/Users/Joe/My \ Documents/My \ Dropbox/Code/boost_1_46_1/stage/lib - libboost_system.a и libboost_filesystem.a.

То, что я не понимаю,

а) Что эти строки я использую boost_system-мт и т.д.? Где они определены, на что они ссылаются? Как они разрешают фактические библиотеки?

b) По какой-то причине, если я попытаюсь сделать это самостоятельно, ld жалуется, что он не может найти lib. Например:

г ++ dcc_to_png.c -L "/ cygdrive/с/Пользователи/Joe/Мои документы/My Dropbox/Код/boost_1_46_1/этап/Библиотека" -llibboost_system.a -llibboost_filesystem.a

выходы:

/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: не может найти -llibboost_system.a /usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../../i686-pc-cygwin/bin/ld: не удается найти -llibboost_filesystem .a collect2: ld возвращено 1 exit s tatus

c) В инструкции, которая компилирует + ссылки, почему я должен использовать -mt в конце boost_system? Я понимаю, что означает -mt, но как это разрешает lib в моей файловой системе?

ответ

2

Хорошо - так нашел некоторые вещи. Сначала с точки зрения путей поиска см .: http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html. Это помогает прояснить пути поиска при связывании.

Во-вторых - обратите внимание на идею использования -mt в конце имени от более старого соглашения о форсировании, которое больше не требуется.

См: http://groups.google.com/group/linux.debian.bugs.dist/browse_thread/thread/5177d8bf13791038?pli=1

И последнее, но не в последнюю очередь - если вы являетесь пользователем Cygwin, как я, есть несколько моментов, которые вы должны знать. Когда вы устанавливаете инструменты devel, вы, возможно, установили версию заголовков boost до 46_1 (которые я использую). Они будут в/usr/include/boost /, и если вы будете использовать эти заголовки после того, как вы создадите boost в своей системе, ваши библиотеки не будут соответствовать найденным вами заголовкам, и вы всегда получите неопределенную ссылку на boost::system::get_system_category() because these headers may expect you to reference the -mt libs. If you didn't build boost on your box this will work fine if you just include a -mt` в конце рассматриваемой библиотеки (это было для меня на другой коробке, которая была ошеломляющей, пока я не понял).

Ответ на этот вопрос для меня состоял в том, чтобы создать резервную копию (на всякий случай), а затем уничтожить заголовки в /usr/include/boost/, а затем принудительно включить заголовочные заголовки исходного кода ala -I и принудительно связывать полные пути с моими библиотеками. Это заставляет g ++ использовать libs + заголовки, которые соответствуют.

$ g++ dcc_to_png.c dccinfo.c -I"$CODEDIR/boost_1_46_1/" -include dccinfo.h /usr/lib/filesystem/build/gcc-4.3.4/release/link-static/threading-multi/libboost_filesystem.a /usr/lib/system/build/gcc-4.3.4/release/link-static/threading-multi/libboost_system.a -o dcc_to_png.exe 

Это работает, но это будет работать, только если g ++ не найдет эти старые заголовки. Если вы не создали boost и хотите, чтобы это сработало, я считаю, что вы можете оставить -I и просто использовать -lboost_filesystem-mt -lboost_system-mt, но это АБСОЛЮТНО зависит от ВЕРСИИ повышения. (см. выше).

0

Не

-llibboost_system.a -llibboost_filesystem.a 

Но

-lboost_system -lboost_filesystem 

Или обеспечить полный путь

g++ dcc_to_png.c /cygdrive/c/Users/Joe/My Documents/My Dropbox/Code/boost_1_46_1/stage/lib/libboost_filesyste.a /cygdrive/c/Users/Joe/My Documents/My Dropbox/Code/boost_1_46_1/stage/lib/libboost_system.a 
+1

Но почему? можете ли вы объяснить или предоставить ссылку о том, как ld находит эти вещи? – j03m

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