我刚刚使用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
答案 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 Template和C++ Library Project Template。 CMake可通过命令“sudo port install cmake”通过MacPorts获得。
如果您对安装CMake不感兴趣,我还应该指出,您可能有兴趣了解一些环境变量,以便让您的生活更轻松,即:
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目录是没有意义的。