5

我正在尝试使用 qmake 在我的系统中编译一个项目。项目的一些依赖项没有安装,但驻留在我的主目录中,或多或少像这样: libs 文件:/home/myusername/local/lib和我的包含目录/home/myusername/local/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
}

并且生成的 makefile 将生成如下命令:

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

很明显,我的包含目录在-Igcc 的选项中。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++ 没有问题。

4

2 回答 2

1

我注意到 QT 的自动包含路径没有尾部斜杠,而你的也有。您是否尝试过在不使用斜杠的情况下编写路径?

linux-g++ {
 INCLUDEPATH += /home/myusername/local/include
 LIBS += -L/home/myusername/local/lib -lqjson
}
于 2011-07-23T19:42:27.810 回答
1

G++ and friends (i.e. as, ld, etc) will not directly tell you exactly where it looks for header and library files. One way to debug this is to run strace -o output.txt -eopen -s 1024 -f qmake. This will run qmake logging all open system calls of qmake and all of the child processes it forks. You will then be able to see in what directories and in what order it searches for header files (and libraries). Example output extract for 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
于 2011-07-23T19:50:06.707 回答