C++ 在c++;
我刚刚使用mac端口(sudo install gd2)安装了gd2,它在以下位置安装了库:C++ 在c++;,c++,macos,gd,C++,Macos,Gd,我刚刚使用mac端口(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 这是我的制作文件: dev: main.o g++ -L/opt/local/lib -I/opt/local/include -lgd -lpng -lz -ljpeg -lfreet
/opt/local/include/gd.h
/opt/local/lib/libgd.dylib (link)
/opt/local/lib/libgd.la
/opt/local/lib/libgd.a
这是我的制作文件:
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在正确的位置搜索库
德鲁·J·索恩
注:使用:
-OSX 10.6.2
-gcc版本4.2.1(Apple Inc.build 5646)(dot 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:没有这样的文件或目录
编辑:
感谢所有人的回答,这里是我的最终(工作)制作文件,供其他许多想要答案的人使用:
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
与其直接调用g++,我强烈建议您使用(如果您想了解更多,请观看),因为它将使您的生活方式更加轻松,并大大简化针对各种库的定位和链接。这就是说,我认为调用的问题在于您没有指定库,而您将使用
-lgd
。您的-L/opt/local/lib
正确地告诉g++查找/opt/local/lib
,但您从未告诉它要查找什么。至于查找适当的头,您可以使用-I/opt/local/include
将/opt/local/include
放入编译器的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})
查找_包(需要GD2)
INCLUDE_目录(${GD2_INCLUDE_DIRS})
链接目录(${GD2\u库\u目录})
添加\u可执行文件(热图主热图\u热图\u点)
目标链接库(热图${GD2_库})
如果您有兴趣了解更多关于CMake的信息,您可能想看看and,它利用了CMake构建系统。CMake可通过MacPorts通过命令“sudo port install CMake”获得
如果您对安装CMake不感兴趣,我还应该指出,为了让您的生活更轻松,您可能有兴趣了解一些环境变量,即:
- CPATH
- 图书馆径
- 动态备份库路径
-I
标志指定它们一样(即,将在这些路径中搜索标题)。库路径是等效的,不同的是,它好像文件夹中有-L
(即,将自动在该路径中搜索库)。动态链接器将使用DYLD_FALLBACK_LIBRARY_PATH(因此您可能应该将LIBRARY_PATH中的路径包含在此变量中)
您可以在链接处阅读有关的详细信息。头包含目录需要使用-I选项指定(在此之后只需要相对路径),链接器包含带有-L的目录(此处也包括相对路径)
对于库,您可以选择设置LD_LIBRARY_路径,但-L方法更安全。答案相当复杂。 简而言之,当您编译自己的libs/工具时,请将它们放在一些
local
目录中,如您上面使用的或/usr/local/lib
和/usr/local/include
甚至~/local/lib
目录中,并始终将它们添加到您的编译器/链接器中
关于Linux的较长的答案是,它解释了从编译器/链接器到执行的每一个相关工具都在寻找什么,并了解了标准,当然它没有绑定,但很高兴知道
我假设您的每个项目都有一个简单的Makefile设置,这样您就不必费心键入所有这些命令。如果您不这样做,我强烈建议您设置一个简单的Makefile模板,以便在项目中重用
编辑:
在编辑的答案中,您的路径可能不正确
路径中的
类似于/libraries
指定当前目录,这意味着它将查看当前目录中的库
目录。如果在根目录中删除libraries
目录,则删除
,因此应该是这样的-L/libraries/lib
,对于-I/libraries/…
,我认为您的问题可能是-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年没有使用makefiles了(但正如我在另一篇帖子的评论中提到的,我发现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
使用#include“gd.h”时需要使用-iNote,请参见
另外,在链接阶段指定include目录也是毫无意义的。我最近一直在使用JamPlus,非常喜欢它。@Sameer,他正确地使用了-L标志,但忘了用-L指定一个库。@Michael似乎他也从其他答案中学到了一些东西,所以其他答案可能并不像你想的那样完全不相关。@Michael,