2010-03-23 67 views
9

我只是用MAC端口(须藤安装GD2),其安装在以下地方库安装GD2:设置库包括在C++中的路径

/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++程序,我加上“#包括‘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 search int eh适合库的位置?

德鲁J.索内。

PS。使用: - OSX 10.6.2 - gcc版本4.2.1(苹果公司建立5646)(点1)

编辑: 好了,所以考虑到stfanB和迈克尔的回答后,我重新编译GD到本地目录(libraries),因此,我已经改变了我的Makefile文件的第一行(我将高清退房的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 

回答

14

我强烈建议您不要直接调用g ++,而应该使用CMake(如果您想了解更多信息,请参阅CMake Google Techtalk),因为这会让您的生活更轻松,并且可以大大简化对各种库的定位和链接。也就是说,我相信你调用的问题是你没有指定库,你会用-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的,你可能想看看C++ Application Project TemplateC++ Library Project Template ,它使用CMake构建系统。 CMake可以通过MacPorts通过命令“sudo port install cmake”获得。

如果你不感兴趣的安装CMake的,我也应该指出的是,也有一些环境变量,你可能有兴趣知道有关使您的生活更轻松,即:

  • CPATH
  • LIBRARY_PATH
  • DYLD_FALLBACK_LIBRARY_PATH

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

您可以在链接中阅读关于environment variables affecting gcc的更多信息。

+0

我最近一直在使用JamPlus,非常喜欢它。 – 2010-03-23 01:47:14

1

头文件包含的目录需要用-I选项指定(只有在此之后需要相对路径)并且链接程序包含带有-L的目录(这里也是相对路径)。

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

+1

@Sameer,他正确使用了-L标志,但忘了用-l指定一个库。 – 2010-03-23 01:49:18

3

答案相当复杂。

简短的回答,因为你或/usr/local/lib/usr/local/include甚至~/local/lib~/local/include以上使用,始终这些添加到您的编译器/连接时,您编译自己的库/工具,将它们放置在一些local目录等。

更长的回答 - 阅读Programming Library HOWTO Linux解释每个涉及的工具从编译器/链接器到执行,看看标准的directory structure of Linux system这当然没有约束力,但很高兴知道。

我假设你有一个简单的Makefile设置为你的每个项目,所以你不必打扰所有这些命令。如果你不这样做,我强烈建议设置一个简单的Makefile模板,以便你的项目可以重复使用。

编辑

在你编辑的回答你的路可能不正确。

您的路径中的../libraries指定当前目录,这意味着它将查看当前目录中的libraries目录。如果您在根目录彪libraries目录,然后删除.所以它应该是这样的-L/libraries/lib,同样为-I/libraries/...

+0

@迈克尔好像他从其他答案中学到了一些东西,所以其他答案可能并不像你想象的那样完全不相关。 – stefanB 2010-03-23 02:07:22

+0

@迈克尔,你明白了,但是斯蒂芬的权利,我得到了更多的其他答案。 ;-) @stefanB,是的,我把它放在我的项目目录中。 – Drew 2010-03-23 02:12:04

+0

我很高兴我们都能够帮助你...点不重要 – stefanB 2010-03-23 02:16:56

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 

不sure-我没有在20年内用于生成文件(但正如我在另一个帖子的评论中提到,我觉得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 
+0

@ dash-tom-bang,FYI,CXXFLAGS通常用于C++设置,而LDFLAGS用于链接器标志。您应该使用预定义变量$(CXX)作为C++编译器,而不是在g ++中进行硬编码。另外,main.o:main.cpp是自动定义的。将main.o指定为依赖关系足以使Make使用默认的C++编译器自动编译main.cpp,并使用CXXFLAGS中指定的任何设置。 – 2010-03-23 02:18:07

+0

@Michael谢谢。 – 2010-03-23 19:13:09