G : попытка добавить include и lib в каталог по умолчанию

#c #linker

#c #компоновщик

Вопрос:

Я скомпилировал тест Google C . Сейчас я пытаюсь добавить его в свою установку g (на Cygwin), чтобы мне не нужно было указывать -I , -L , и -l для каждого проекта. Шаги, которые я сделал, были:

  1. Я поместил символическую ссылку в /usr/local/include на GTEST_ROOT/include/gtest
  2. Я помещаю символические ссылки в /usr/local/lib на библиотеки в GTEST_ROOT/lib (libgtest.la libgtest_main.la )
  3. Я написал пробную программу для тестирования настройки

Тестовая программа отлично компилируется g -c proof.cpp , но g proof.cpp выдает ошибки во время компоновки, сообщая, что ссылки gtest не могут быть найдены.

Используя grep для поиска в моем GTEST_ROOT необходимых ссылок, я нашел их в дополнительных библиотеках в GTEST_ROOT/lib/.libs (libgtest.a libgtest.la libgtest.lai libgtest_main.a libgtest_main.(libgtest_main.lai)

Из-за нехватки времени я заставил его работать, используя следующую команду g -LGTEST_ROOT/lib/.libs -lgtest proof.cpp , и я поместил это в makefile.

Тем не менее, я все еще пытаюсь настроить свою настройку таким образом, чтобы g proof.cpp она просто работала. Чего мне не хватает?

Благодаря Мэтту, теперь я понимаю, что не могу удалить -lgtest . Я хотел бы, по крайней мере, избавиться от -LGTEST_ROOT/lib/.libs . Я добавил символические ссылки на дополнительные .a и .lai предоставленные файлы. Однако g proof.cpp -lgtest теперь выдает ошибку компоновщика: cannot find -lgtest

ПРИМЕЧАНИЕ: символическая ссылка на библиотеки в GTEST_ROOT/lib/.libs по-прежнему не дает желаемых результатов.

Ответ №1:

Вам всегда нужно будет перейти -lgtest к окончательному этапу компиляции / компоновки 1. GCC не будет искать отсутствующие символы во всех библиотеках в своем пути поиска (это было бы слишком дорого).

Сами файлы библиотеки ( .so или .a ) должны быть в /usr/local/lib/ каталоге или символическая ссылка на эти файлы. Символическая ссылка на каталог там не будет работать.

1 ну, это технически неверно. Вы можете изменить свой файл спецификации, но не делайте этого.

Комментарии:

1. Спасибо, Mat. У меня были символические ссылки на libgtest.la and libgtest_main.la (а не на каталог). По вашему предложению я также добавил символические ссылки на файлы .a and .lai (файлов не было .so ). Поэтому я ожидаю, что g proof.cpp -lgtest это сработает, но вместо этого я получаю cannot find -lgtest сообщение об ошибке. Есть предложения?

2. Попробуйте удалить все символические ссылки, кроме указанных .a . Кстати, у gtest нет make install цели? Вам не нужно делать ничего из этого вручную, процесс создания должен обрабатывать часть установки (и исправление .la файлов для установки).

3. Еще раз спасибо, Mat. Никаких изменений при удалении всех файлов, кроме .a файлов. И gtest make install с пользой подсказывает вам прочитать README, в котором нет инструкций относительно того, что делать с библиотеками.

Ответ №2:

Вам всегда нужно указывать этот параметр, если вы хотите использовать его — для этого и нужен Makefile — поэтому вам не нужно вводить эти длинные строки при каждой компиляции. Если вы хотите, вы также можете использовать переменную среды LDFLAGS для их хранения, но тогда она будет связана с каждым исполняемым файлом, который вы компилируете — это определенно не очень хорошая идея.