Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c++;_C++_Macos_Gd - Fatal编程技术网

C++ 在c++;

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

我刚刚使用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 -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
  • 图书馆径
  • 动态备份库路径
CPATH环境变量与PATH环境变量非常相似(它是一个以冒号分隔的目录列表),不同之处在于gcc和g++将自动使用该变量中的目录,就像在命令行上使用
-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,