Опции gcc -I и -L не работают - PullRequest
5 голосов
/ 23 июля 2011

Я пытаюсь скомпилировать проект в моей системе, используя qmake.Некоторые зависимости проекта не установлены, но находятся в моем домашнем каталоге, примерно так: файлы libs: /home/myusername/local/lib и мой каталог include /home/myusername/local/include.Внутри каталога include у меня есть папка qjson с необходимыми заголовками из библиотеки.В папке lib у меня есть файлы libqjson.so libqjson.so.0 libqjson.so.0.7.1.

Мой файл проекта qmake выглядит примерно так:

linux-g++ {
INCLUDEPATH += /home/myusername/local/include/
LIBS += -L/home/myusername/local/lib/ -lqjson
}

и сгенерированный make-файл выдаст такие команды:

g++ -c -pipe -g -Wall -W -D_REENTRANT -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB \
    -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../qbuzz \
    -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtNetwork -I/usr/include/qt4/QtGui \
    -I/usr/include/qt4 -I/home/myusername/local/include/ -I. -I. -I../myproject -I. \
    -o qbuzz-result.o ../myproject/myfile.cc

Понятно, что мой каталог include находится в опции -I gcc.myfile.cc содержит следующее включение:

#include <qjson/parser.h>

Однако после запуска make я получаю сообщение об ошибке:

../myproject/myfile.cc:2:26: fatal error: qjson/parser.h: No such file or directory
compilation terminated.

Теперь, если я изменю переменную среды CPLUS_INCLUDE_PATHчтобы добавить мой локальный файл включения, у меня нет проблем там, но на этапе компоновщика я получил ошибку:

/usr/bin/ld: cannot find -lqjson
collect2: ld returned 1 exit status

Даже при том, что команда компоновщика была:

g++ -omyprogram main.o mainwindow.o myfile.o moc_mainwindow.o -L/usr/lib \
    -L/home/myusername/local/lib/ -lqjson -lQtGui -lQtNetwork -lQtCore -lpthread 

Я такжеможно обойти изменение переменной окружения LIBRARY_PATH.Однако я ищу решение, которое основано на изменении как можно меньшего количества переменных среды, и, в конце концов, почему есть опции -L и -I?

Я работаю на Windows без проблем, используя MinGW g ++.

Ответы [ 2 ]

1 голос
/ 23 июля 2011

G ++ и друзья (то есть as, ld и т. Д.) Не будут напрямую сообщать вам, где именно они ищут файлы заголовков и библиотек. Один из способов отладки - запустить strace -o output.txt -eopen -s 1024 -f qmake. Это запустит qmake протоколирование всех open системных вызовов qmake и всех дочерних процессов, которые он разветвляет. После этого вы сможете увидеть, в каких каталогах и в каком порядке он ищет заголовочные файлы (и библиотеки). Пример вывода экстракта для stdio.h:

26069 open("/usr/lib/gcc/x86_64-redhat-linux/4.6.0/include/stdio.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
26069 open("/usr/local/include/stdio.h", O_RDONLY|O_NOCTTY) = -1 ENOENT (No such file or directory)
26069 open("/usr/include/stdio.h", O_RDONLY|O_NOCTTY) = 4
1 голос
/ 23 июля 2011

Я заметил, что пути автоматического включения в QT не имеют конечных косых черт, как и ваши. Вы пробовали писать пути без косой черты?

linux-g++ {
 INCLUDEPATH += /home/myusername/local/include
 LIBS += -L/home/myusername/local/lib -lqjson
}
...