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

Dre*_*rew 10 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
Run Code Online (Sandbox Code Playgroud)

这是我的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
Run Code Online (Sandbox Code Playgroud)

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

main.cpp:4:16: error: gd.h: No such file or directory
Run Code Online (Sandbox Code Playgroud)

如果我将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
Run Code Online (Sandbox Code Playgroud)

所以,我理解这意味着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和迈克尔的答案之后,我已经将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
Run Code Online (Sandbox Code Playgroud)

Mic*_*yan 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++应用程序项目模板C++库项目模板.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到此变量的路径).

您可以在链接中阅读有关影响gcc环境变量的更多信息.