设置库包括c ++中的路径

时间:2010-03-23 01:25:46

标签: c++ macos gd

我刚刚使用mac ports(sudo install gd2)安装了gd2,它在以下地方安装了库:

/opt/local/include/gd.h
/opt/local/lib/libgd.dylib (link)
/opt/local/lib/libgd.la
/opt/local/lib/libgd.a

这是我的make文件:

dev: main.o
    g++ -L/opt/local/lib -I/opt/local/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap

main.o: main.cpp
    g++ -c main.cpp

因此,当我创建我的c ++应用程序时,我添加'#include“gd.h”',它会抛出:

main.cpp:4:16: error: gd.h: No such file or directory

如果我将gd.h设置为绝对路径(如上所述)(不是解决方案,但很奇怪),我会被抛出:

g++ -L/opt/local/include -L/opt/local/lib main.o -o heatmap
Undefined symbols:
  "_gdImagePng", referenced from:
      _main in main.o
  "_gdImageLine", referenced from:
      _main in main.o
  "_gdImageColorAllocate", referenced from:
      _main in main.o
      _main in main.o
  "_gdImageDestroy", referenced from:
      _main in main.o
  "_gdImageCreate", referenced from:
      _main in main.o
  "_gdImageJpeg", referenced from:
      _main in main.o
ld: symbol(s) not found

所以,我理解这意味着ld找不到它需要的库(因此尝试用“-L”值给它提示)。所以在给g ++提供-L提示和#include中的绝对路径后,我可以让它工作,但我不认为我必须这样做,我怎样才能使g ++ / ld搜索到适合的库的位置?

Drew J. Sonne。

PS。使用:   - OSX 10.6.2   - gcc版本4.2.1(Apple Inc. build 5646)(第1点)

编辑: 好的,所以在考虑了stfanB和Michael的回答之后,我已经将gd重新编译到本地目录(libraries)中,因此,我已经改变了我的Makefile的第一行(我将def检查cmake)到g++ -L./libraries/lib -I./libraries/include -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap 但我仍然得到main.cpp:3:16: error: gd.h: No such file or directory

编辑: 谢谢大家的答案,这是我最后(工作)的makefile,适合其他许多想要答案的人:

dev: main.o
    g++ -I./libraries/include -L./libraries/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap

main.o: main.cpp
    g++ -I./libraries/include -c main.cpp

5 个答案:

答案 0 :(得分:14)

我强烈建议您使用CMake(如果您想了解更多信息,请注意CMake Google Techtalk),而不是直接调用g ++,因为它会让您的生活更轻松,并大大简化了定位和链接各种库。也就是说,我相信你调用的问题是你没有指定库,你可以使用-lgd。你的-L/opt/local/lib正确告诉g ++查看/opt/local/lib,但你从来没有告诉过它要找什么。至于查找适当的标头,您可以使用-I/opt/local/include/opt/local/include放入编译器的包含搜索路径中。

如果你注意我使用CMake的建议,那么这样做会是这样的:

FIND_PACKAGE(GD2 REQUIRED)
INCLUDE_DIRECTORIES(${GD2_INCLUDE_DIRS})
LINK_DIRECTORIES(${GD2_LIBRARY_DIRS})

ADD_EXECUTABLE(heatmap main Heatmap_Map Heatmap_Point)
TARGET_LINK_LIBRARIES(heatmap ${GD2_LIBRARIES})

如果您有兴趣了解有关CMake的更多信息,可能需要查看使用CMake构建系统的C++ Application Project TemplateC++ Library Project Template。 CMake可通过命令“sudo port install cmake”通过MacPorts获得。

如果您对安装CMake不感兴趣,我还应该指出,您可能有兴趣了解一些环境变量,以便让您的生活更轻松,即:

      
  • CPATH
  •   
  • LIBRARY_PATH
  •   
  • DYLD_FALLBACK_LIBRARY_PATH

CPATH环境变量很像PATH环境变量(它是以冒号分隔的目录列表),除了该变量中的目录将由gcc和g ++自动使用,就好像它们是在命令行上使用-I标志(即将在这些路径中搜索标题)。 LIBRARY_PATH是等效的,除了它就像文件夹是用-L一样给出的(即库将自动在该路径中搜索)。 DYLD_FALLBACK_LIBRARY_PATH将由动态链接器使用(因此您可能应该包含从LIBRARY_PATH到此变量的路径)。

您可以在链接中详细了解environment variables affecting gcc

答案 1 :(得分:3)

答案非常复杂。

简短的回答是,当您编译自己的库/工具时,将它们放在某个local目录中,例如您在上面使用的目录或/usr/local/lib/usr/local/include甚至~/local/lib~/local/include并始终将这些添加到您的编译器/链接器。

更长的答案 - 阅读Programming Library HOWTO for Linux,解释所涉及的每个工具所寻找的内容,从编译器/链接器到执行,并查看标准directory structure of Linux system,当然不具有约束力但很高兴知道。

我假设您为每个项目设置了一个简单的Makefile,因此您不必费心去键入所有这些命令。如果不这样做,我强烈建议您设置一个可以重复用于项目的简单Makefile模板。

修改

在您编辑的答案中,您的路径可能不正确。

路径中的../libraries指定当前目录,这意味着它将查看当前目录中的libraries目录。如果你在根目录中找到libraries目录,那么删除.,这样就应该像-L/libraries/lib一样-I/libraries/...

答案 2 :(得分:1)

标题包含需要使用-I选项指定的目录(此后仅需要相对路径),链接器包含带-L的目录(此处也是相对路径)。

对于库,您可以选择设置LD_LIBRARY_PATH,但-L方法更安全。

答案 3 :(得分:1)

我认为您的问题可能是您的-I参数也需要传递到编译阶段。也许是这样的?

dev: main.o
    g++ -L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm main.o -o heatmap

main.o: main.cpp
    g++ -I/opt/local/include -c main.cpp

不确定 - 我在20年内没有使用过makefile(但正如我在另一篇文章的评论中所提到的,我发现JamPlus的力量非常出色)。

无论如何 - 通常你的编译器和链接器标志将被放入变量然后在命令行中扩展,但我不确定make语法。也许只是:

CFLAGS=-I/opt/local/include
LINKFLAGS=-L/opt/local/lib -lgd -lpng -lz -ljpeg -lfreetype -lm 

dev: main.o
    g++ $(LINKFLAGS) main.o -o heatmap

main.o: main.cpp
    g++ $(CFLAGS) -c main.cpp

答案 4 :(得分:0)

使用#include“gd.h”时需要使用-iquote,请参阅gcc directory options documentation

另外,在链接阶段指定include目录是没有意义的。