代码之家  ›  专栏  ›  技术社区  ›  Drew

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

  •  10
  • Drew  · 技术社区  · 16 年前

    我刚刚使用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
    

    这也是我的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在正确的地方搜索库呢?

    Drew J. Sonne。

    使用: - OSX0.62. -GCC 4.2.1版(苹果公司5646版)(DOT 1)

    编辑: 好吧,在考虑了stfanb和michael的答案之后,我已经将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
    
    5 回复  |  直到 13 年前
        1
  •  14
  •   Michael Aaron Safyan    16 年前

    与其直接调用g++,我强烈建议您使用 CMake (观看) CMake Google Techtalk 如果你想了解更多),因为它会让你的生活变得更简单,并大大简化与各种库的定位和链接。也就是说,我相信您的调用的问题在于您没有指定库,这是您要处理的 -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})
    

    如果您有兴趣了解更多关于cmake的信息,您可能需要查看 C++ Application Project Template 和 C++ Library Project Template 使用cmake构建系统。cmake通过macports通过命令“sudo port install cmake”提供。

    如果您对安装cmake不感兴趣,我还应该指出,您可能对一些环境变量感兴趣,这些变量可以使您的生活更轻松,即:

    • cPATH
    • 图书馆路径
    • Dyld_回退_库_路径

    cpath环境变量与path环境变量非常相似(它是以冒号分隔的目录列表),但gcc和g++将自动使用该变量中的目录,就像在命令行上使用 -I 标记(即,将在这些路径中搜索标题)。库路径是等效的,但它就像文件夹 -L (即,库将自动在该路径中搜索)。动态链接器将使用dyld_fallback_library_path(因此,您可能应该将library_path中的路径包含在此变量中)。

    你可以阅读更多关于 environment variables affecting gcc 在链接上。

        2
  •  3
  •   stefanB    16 年前

    答案相当复杂。

    简短的答案是,当您编译自己的libs/tools时,将它们放在 local 上面使用的目录或 /usr/local/lib 和 /usr/local/include 甚至 ~/local/lib 和 ~/local/include 并且总是将这些添加到编译器/链接器中。

    更长的答案-阅读 Programming Library HOWTO 对于Linux,它解释了所涉及的每个工具的查找范围,从编译器/链接器到执行,并查看标准 directory structure of Linux system 这当然不具有约束力,但很高兴知道。

    我假设您为每个项目都有一个简单的makefile设置,这样您就不必费心输入所有这些命令。如果您不这样做,我强烈建议您设置一个简单的makefile模板,您可以在项目中重用它。

    编辑 :

    在您编辑的答案中,您的路径可能不正确。

    这个 . 在你的道路上 ./libraries 指定当前目录,这意味着它将查找 libraries 当前目录中的目录。如果你 图书馆 根目录中的目录,然后删除 . 所以应该是这样的 -L/libraries/lib 同样地 -I/libraries/...

        3
  •  1
  •   Sameer    16 年前

    头包含目录需要用-i选项指定(这之后只需要相对路径),链接器包含带有-l的目录(这里也有相对路径)。

    对于库,您可以选择设置ld_library_路径,但-l方法更安全。

        4
  •  1
  •   dash-tom-bang    16 年前

    我认为您的问题可能是您的-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
    
        5
  •  0
  •   santeri    13 年前

    使用时需要使用-iquote包括“gd.h”,请参见 gcc directory options documentation .

    另外,在链接阶段指定include目录是没有意义的。