Повысить пути статических ссылок c ++ под Cygwin - PullRequest
1 голос
/ 08 мая 2011

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

Последнее утверждение компиляции: g ++ dcc_to_png.c -lboost_system-mt -lboost_filesystem-mt, но с учетом boost / state / lib перечисленных имен библиотекв / cygdrive / c / Users / Joe / My \ Documents / My \ Dropbox / Code / boost_1_46_1 / stage / lib находятся libboost_system.a и libboost_filesystem.a.

Чего я не понимаю, так это

a) Что это за строки, которые я использую boost_system-mt и т. Д.?Где они определены, на что они ссылаются?Как они переходят в настоящие библиотеки?

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

g ++ dcc_to_png.c -L "/ cygdrive / c / Пользователи / Джо / Мои документы / Мой Dropbox / Код / boost_1_46_1 / stage / lib" -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 состояние выхода

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

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

Хорошо, - так что нашел кое-что. Сначала с точки зрения путей поиска см .: 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, возможно, вы установили версию надбавок до 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 голосов
/ 08 мая 2011

Не

-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
...