我正在尝试使用qmake在我的系统中编译项目。项目的某些依赖项未安装但位于我的主目录中,或多或少像这样:libs文件:/home/myusername/local/lib
和我的包含目录/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
}
生成的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
很明显,我的include目录位于gcc的-I
选项中。 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存在?
我使用MinGW g ++在Windows上工作没有问题。
答案 0 :(得分:1)
我注意到QT的自动包含路径没有拖尾斜杠,你的确如此。您是否尝试过编写路径而不使用斜杠?
linux-g++ {
INCLUDEPATH += /home/myusername/local/include
LIBS += -L/home/myusername/local/lib -lqjson
}
答案 1 :(得分:1)
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