gcc -I和-L选项似乎不起作用

时间:2011-07-23 10:08:58

标签: c++ linux gcc include-path qjson

我正在尝试使用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上工作没有问题。

2 个答案:

答案 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