【问题标题】:FileGDB: 'make' fails for sample (Ubuntu 15)FileGDB:样本的“制作”失败(Ubuntu 15)
【发布时间】:2016-04-26 17:29:56
【问题描述】:

我一直在寻找如何让 FileGDB Samples 编译(我假设当我修复这个问题时,我将能够在 FileGDB 支持的情况下编译 GDAL。它在没有 FileGDB 支持的情况下编译得很好。)。我以前在 Debian 7 上做过,并比较了几个站点的注释。我用c:\temp下载解压,然后复制到/usr/local/FileGDB_API

以下是我遵循的步骤 (x64): http://hydrogeotools.blogspot.be/2013/07/install-gdal-with-file-gdb-and.html

从 esri 下载 filegdb api,确保为您的 64 位机器等选择 64 位,解压到 ~/src/ 并通过将文件复制到更相关的位置来“安装”

sudo cp -r ~/src/FileGDB_API /usr/local/

然后通过打开 /etc/ld.so.conf 来修复链接

sudo gedit /etc/ld.so.conf

并将以下行放入文件中, /usr/local/FileGDB_API/lib 保存并关闭文件,然后更新链接

sudo ldconfig

测试一下

cd ~/src/FileGDB_API/samples
make
cd ~/src/FileGDB_API/samples/bin
./Querying

但是当我运行 make 时,我得到了这个:

make -C Domains
make[1]: Entering directory '/usr/local/FileGDB_API/samples/Domains'
g++ -fPIC -O3 -m64 -W -fexceptions -D_CONSOLE -DUNICODE -D_UNICODE -DUNIX -D_REENTRANT -DFILEGDB_API -D__USE_FILE_OFFSET64 -DUNIX_FILEGDB_API -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -I../../include -I.  -c Domains.cpp
g++ -fPIC -O3 -m64 -W -fexceptions -D_CONSOLE -DUNICODE -D_UNICODE -DUNIX -D_REENTRANT -DFILEGDB_API -D__USE_FILE_OFFSET64 -DUNIX_FILEGDB_API -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE -I../../include -I. -m64 -L"../../lib" -o ../bin/Domains ./Domains.o -lFileGDBAPI
./Domains.o: In function `main':
Domains.cpp:(.text.startup+0x8e): undefined reference to `FileGDBAPI::OpenGeodatabase(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, FileGDBAPI::Geodatabase&)'
Domains.cpp:(.text.startup+0xe7): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x1af): undefined reference to `FileGDBAPI::Geodatabase::DeleteDomain(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)'
Domains.cpp:(.text.startup+0x247): undefined reference to `FileGDBAPI::Geodatabase::DeleteDomain(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&)'
Domains.cpp:(.text.startup+0x553): undefined reference to `FileGDBAPI::Geodatabase::CreateDomain(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Domains.cpp:(.text.startup+0x58f): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x6a4): undefined reference to `FileGDBAPI::Geodatabase::GetDomainDefinition(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const'
Domains.cpp:(.text.startup+0x6f8): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x98e): undefined reference to `FileGDBAPI::Geodatabase::CreateDomain(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Domains.cpp:(.text.startup+0x9ca): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0xba7): undefined reference to `FileGDBAPI::Geodatabase::AlterDomain(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Domains.cpp:(.text.startup+0xbe0): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0xd09): undefined reference to `FileGDBAPI::Geodatabase::OpenTable(std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> > const&, FileGDBAPI::Table&)'
Domains.cpp:(.text.startup+0xd60): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0xee2): undefined reference to `FileGDBAPI::Table::AlterField(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Domains.cpp:(.text.startup+0xf1b): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0xf9b): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorRecord(int, int&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x1144): undefined reference to `FileGDBAPI::Table::AlterField(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
Domains.cpp:(.text.startup+0x117d): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x11fd): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorRecord(int, int&, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
Domains.cpp:(.text.startup+0x1314): undefined reference to `FileGDBAPI::ErrorInfo::GetErrorDescription(int, std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >&)'
collect2: error: ld returned 1 exit status
Makefile:33: recipe for target '../bin/Domains' failed
make[1]: *** [../bin/Domains] Error 1
make[1]: Leaving directory '/usr/local/FileGDB_API/samples/Domains'
Makefile:26: recipe for target 'Domains' failed
make: *** [Domains] Error 2

这可能是一个更普遍的错误,我对 Linux 还不是很熟悉,但我希望得到一些帮助/指针。

【问题讨论】:

    标签: ubuntu makefile


    【解决方案1】:

    我在使用 FileGDB_API 1.3 和 1.4 64 位的 Ubuntu 15 上遇到了同样的问题。

    我找到了解决方案:我必须使用 g++-4.8 编译 GDAL,而不是使用作为标准编译器安装在我的 ubuntu 15 上的 g++-5.2.1 编译 GDAL

    sudo apt-get install g++-4.8
    export CXX=g++-4.8
    cd FileGDB_API_1_4/samples
    make clean
    make
    cd gdal-2
    make clean
    make
    sudo make install
    

    【讨论】:

    • 我很想知道您是如何发现需要降级的编译器的?
    • 我真的不记得了,那是几个月前的事了。感谢您使用 CXXFLAGS 的替代方法。
    • NP,虽然我可能过早地发布了 - 构建还可以,但是在愤怒中使用驱动程序会导致段错误。毕竟,用 4.8 重新编译成功了,我想这是一种不那么“流血”的方法,而不是仅仅强制使用最新的编译器。
    【解决方案2】:

    我找到了一种不需要回退到旧编译器的替代方法。在gdal/gdal/ogr/ogrsf_frmts/filegdb/GNUmakefile 的makefile 中设置D_GLIBCXX_USE_CXX11_ABI c++ 编译器标志允许g++ 使用用旧版本g++ 构建的fgdb 库:

    CXXFLAGS := -D_GLIBCXX_USE_CXX11_ABI=0

    所以在我的 GNUmakefile 中,前几行是:

    include ../../../GDALmake.opt
    
    OBJ =   FGdbDatasource.o FGdbDriver.o FGdbLayer.o FGdbUtils.o FGdbResultLayer.o
    
    CPPFLAGS    :=  -I../generic  $(FGDB_INC) $(CPPFLAGS)
    CXXFLAGS := -D_GLIBCXX_USE_CXX11_ABI=0  // <---------------------------- I added this line
    
    default:    $(O_OBJ:.o=.$(OBJ_EXT))
    

    找到了一些参考信息 here 和重要的是 here

    更新:虽然编译似乎没有问题,但在构建后从 gdal 运行自动测试模块会导致 fgdb 测试发生灾难性故障(特别是在调用 fgdb_driver.CreateDatasource(path) 时)。使用 g++-4.8 重新编译是一个可行的解决方案。

    【讨论】:

      【解决方案3】:

      与此同时,ESRI 已经更新了他们的文件。 https://github.com/Esri/file-geodatabase-api/blob/master/FileGDB_API_1.5.1/FileGDB_API_1_5_1-64gcc51.tar.gz 专用于 g++/gcc 5.1 及更高版本。

      这样,FileGDB API 在 Ubuntu 16.04 和 18.04 上使用默认编译器版本编译时不会出错。

      另见https://gis.stackexchange.com/questions/292506/how-do-i-install-esri-file-gdb-api-in-ubuntu-16-04-so-qgis-2-8-can-see-it

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2017-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-08
        • 1970-01-01
        相关资源
        最近更新 更多