1

私はこのフォーラムを初めて利用しますが、この問題の解決策を探しているときに何度か見てきました。Ubuntu 用に見つけた C++ API ライブラリ ( libkml-dev_1.2.0-1ubuntu6_amd64 )を使用して、Google Earth で使用する KML ファイルを生成しようとしています。コマンドsudo apt-get install libkml-devを使用してパッケージをインストールしましたが、成功しました。その後、コマンド ライン ターミナルを使用してサンプル フォルダーに移動し、コマンドg++ helloworld.cc -o helloworldでプログラム 'helloworld.cc' を実行してみました。、しかしその後、大量のエラーが発生しました(主に kmldom が未定義の参照であると主張しています)。申し訳ありませんが、テキスト ファイルを添付したかったのですが、方法がわからないため、以下にエラーのサンプルを含めました。私は 1 週間中よく調べ、ヘッダー ファイルが実際にダウンロードに含まれていることを確認し、Google Earth 開発者に問題について連絡しました (そして、彼らはこれとは何の関係もないと回答し、この問題は StackOverflow に送信されます)。

この問題の原因と、これを解決するために何ができるかを知っている人はいますか?


/tmp/cc5u2JyV.o: 関数HelloKml(bool)': helloworld.cc:(.text+0x17): undefined reference to 内 kmldom::KmlFactory::GetFactory()' helloworld.cc:(.text+0x27): kmldom::KmlFactory::CreateCoordinates() const' helloworld.cc:(.text+0x328): undefined reference to kmldom::AsPoint への未定義参照(boost::intrusive_ptrkmldom::Element)' /tmp/ cc5u2JyV.o: 関数boost::intrusive_ptr<kmldom::Coordinates>::intrusive_ptr(kmldom::Coordinates*, bool)': helloworld.cc:(.text._ZN5boost13intrusive_ptrIN6kmldom11CoordinatesEEC2EPS2_b[_ZN5boost13intrusive_ptrIN6kmldom11CoordinatesEEC5EPS2_b]+0x3d): undefined reference to 内 kmlbase::intrusive_ptr_add_ref(kmlbase::Referent*)' /tmp/cc5u2JyV.o: 関数boost::intrusive_ptr<kmldom::Coordinates>::~intrusive_ptr()': helloworld.cc:(.text._ZN5boost13intrusive_ptrIN6kmldom11CoordinatesEED2Ev[_ZN5boost13intrusive_ptrIN6kmldom11CoordinatesEED5Ev]+0x23): undefined reference to 内 kmlbase::intrusive_ptr_release(kmlbase::Referent*)' /tmp/cc5u2JyV.o: 関数boost::intrusive_ptr<kmldom::Geometry>::intrusive_ptr(boost::intrusive_ptr<kmldom::Geometry> const&)': helloworld.cc:(.text._ZN5boost13intrusive_ptrIN6kmldom8GeometryEEC2ERKS3_[_ZN5boost13intrusive_ptrIN6kmldom8GeometryEEC5ERKS3_]+0x35): undefined reference to 内 kmlbase: :intrusive_ptr_add_ref(kmlbase::Referent*)' collect2: ld が 1 つの終了ステータスを返しました

4

2 に答える 2

1

ライブラリを使用するアプリケーションをコンパイルする場合、アプリケーションのコンパイル時にライブラリをリンクする必要があります。したがって、次のパラメーターを使用してみてください。

ライブラリを検索するディレクトリを指定するには、-L を使用します。

-L/data[...]/lib

実際のライブラリ名を指定するには、-l を使用します。

-labc (リンク abc.a または abc.so)

インクルード ファイルを検索するディレクトリを指定するには、-I を使用します。

-I/data[...]/lib

于 2012-06-15T16:25:50.200 に答える
0

私は解決策を見つけました。問題は、libkml を間違ってリンクしていることです。ヘッダー ファイルとライブラリ ファイル (*.so) へのパスを見つける必要があります。ここで見つけました:

/usr/include/kml/(ヘッダー付きのディットを含める)、
/usr/lib/x86_64-linux-gnu/(ライブラリ dir)。

プロジェクトには CMake と CMakeLists.txt を使用します。libkml を使用すると、次のようになります。

`cmake_minimum_required (VERSION 3.2)
# Set language standard
set(CMAKE_CXX_STANDARD "11")
project (test_proj)

add_definitions(-std=c++11)

# Set default build type to RelWithDebInfo if not specified
if (NOT CMAKE_BUILD_TYPE)
    message (STATUS "Default CMAKE_BUILD_TYPE not set using Release with Debug Info")
    set (CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE
        STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel"
        FORCE)
endif()

# linking boost library
find_package(Boost COMPONENTS system filesystem thread REQUIRED)
if(NOT Boost_FOUND)
    message(SEND_ERROR "Failed to find boost.")
    return()
else()
    include_directories(${Boost_INCLUDE_DIRS})
endif()

add_executable(test_proj main.cpp)

set (LibKML_INCLUDE_DIRS /usr/include/kml/)
set (LibKML_LIBRARIES /usr/lib/x86_64-linux-gnu/libkmlbase.so /usr/lib/x86_64-linux-gnu/libkmlconvenience.so /usr/lib/x86_64-linux-gnu/libkmldom.so /usr/lib/x86_64-linux-gnu/libkmlengine.so /usr/lib/x86_64-linux-gnu/libkmlregionator.so /usr/lib/x86_64-linux-gnu/libkmlxsd.so)

message("LibKML is at: ${LibKML_INCLUDE_DIRS} and ${LibKML_LIBRARIES}")
message("Boost is at: ${Boost_INCLUDE_DIRS} and ${Boost_LIBRARIES}")

target_include_directories(test_proj 
PUBLIC 
${LibKML_INCLUDE_DIRS} 
${Boost_INCLUDE_DIRS} ) 

target_link_libraries(test_proj 
PUBLIC
${LibKML_LIBRARIES} ${Boost_LIBRARIES})

install(TARGETS test_proj EXPORT test_proj_export)
export(EXPORT test_proj_export FILE cmake/test_proj-targets.cmake)`
于 2021-12-15T06:13:17.003 に答える