5

C++ OpenImageIOライブラリ ( OpenImageiGO ) のバインディングを提供する Go ライブラリがあります。libOpenImageIO への標準の動的リンクを介してバインディングを喜んで構築してきましたが、現在は静的にリンクしようとしています。どのフラグの組み合わせを試しても、外部リンカが大量の「未定義参照」エラーで失敗するという問題が発生しています。リンカがシンボルを参照する順序に関して問題があったと言って、過去にこの問題が提起されたことを思い出したようです。しかし、私はこの情報を再び見つけることができないようです。

これは私の最新のビルド試行の簡単な例で、boost、OpenColorIO、および OpenImageIO の静的ビルドとリンクするように試みています。

$ export CGO_CPPFLAGS="\
-I/path/to/boost/include \
-I/path/to/OpenColorIO/include \
-I/path/to/OpenImageIO/include"

$ export CGO_LDFLAGS="\
-L/path/to/boost/lib -lboost_thread_static -lboost_system_static \
-L/path/to/OpenColorIO/lib -lopencolorio \
-L/path/to/OpenImageIO/lib -lOpenImageIO"

$ go build -v -x --ldflags '-extldflags "-static"'  github.com/justinfx/openimageigo
...
CGO_LDFLAGS="/path/to/boost/lib/libboost_system_static.a" "/path/to/boost/lib/libboost_thread_static.a" "/path/to/OpenColorIO/lib/libopencolorio.a" "/path/to/OpenImageIO/lib/libOpenImageIO.a" "-lstdc++" /vol/apps/go/1.3.0/pkg/tool/linux_amd64/cgo -objdir $WORK/github.com/justinfx/openimageigo/_obj/ -- -I/path/to/boost/include -I/path/to/OpenColorIO/include -I/path/to/OpenImageIO/include -I./cpp -I $WORK/github.com/justinfx/openimageigo/_obj/ -I/path/to/boost/include -I/path/to/OpenColorIO/include -I/path/to/OpenImageIO/include color.go imagebuf.go imagebufalgo.go imagecache.go imageinput.go imageoutput.go imagespec.go oiio.go roi.go
...
/usr/bin/g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -I/path/to/boost/include -I/path/to/OpenColorIO/include -I/path/to/OpenImageIO/include -I./cpp -I $WORK/github.com/justinfx/openimageigo/_obj/ -g -O2 -o $WORK/github.com/justinfx/openimageigo/_obj/all.cpp.o -c ./all.cpp

/usr/bin/g++ -I . -fPIC -m64 -pthread -fmessage-length=0 -o $WORK/github.com/justinfx/openimageigo/_obj/_cgo_.o $WORK/github.com/justinfx/openimageigo/_obj/_cgo_main.o $WORK/github.com/justinfx/openimageigo/_obj/_cgo_export.o $WORK/github.com/justinfx/openimageigo/_obj/color.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imagebuf.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imagebufalgo.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imagecache.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imageinput.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imageoutput.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/imagespec.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/oiio.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/roi.cgo2.o $WORK/github.com/justinfx/openimageigo/_obj/all.cpp.o /path/to/boost/lib/libboost_system_static.a /path/to/boost/lib/libboost_thread_static.a /path/to/OpenColorIO/lib/libopencolorio.a /path/to/OpenImageIO/lib/libOpenImageIO.a -lstdc++

そして、これは非常に長い出力だったので、厳選されたエラーの一部を以下に示します。

/path/to/OpenImageIO/lib/libOpenImageIO.a(OpenImageIO_dist^src^libOpenImageIO^color_ocio.cpp.o): In function `ColorConfig':
/path/to/OpenImageIO/OpenImageIO_dist/src/libOpenImageIO/color_ocio.cpp:141: undefined reference to `OpenColorIO::v1::SetLoggingLevel(OpenColorIO::v1::LoggingLevel)'
...
/path/to/OpenImageIO/lib/libOpenImageIO.a(OpenImageIO_dist^src^libOpenImageIO^imagebufalgo_copy.cpp.o): In function `boost::shared_mutex::lock()':
/path/to/boost/include/boost/thread/pthread/shared_mutex.hpp:138: undefined reference to `boost::this_thread::disable_interruption::~disable_interruption()'

OpenImageIO は OpenColorIO の参照を見つけられないようです。そして、OpenImageIO はブーストの参照を見つけることができないようです。リンク中に物事が起こっている順序では、OpenColorIO またはブースト シンボルを OpenImageIO で使用できないように見えるため、多数のシンボル エラーが発生します。

ビルドプロセスで修正できる単純で愚かなことをしていることを願っています。しかし、外部ライブラリとの cgo の静的リンクは、デフォルトの動的リンクのアプローチよりも少し複雑に見えます。

更新 #1

@james-henstridge の答えは正しかったので、最後のしゃっくりを除いて、私はほぼ完全に構築されています。正しい順序を持っているように見えますがyaml-cpp、 が必要とするの参照に失敗しています。OpenColorIO

これが私の最新の環境です。ここでは、追加する必要のあるすべての明示的な静的ライブラリを処理しました。

$ export CGO_CPPFLAGS="-I/usr/local/include -I/usr/include"

$ export CGO_LDFLAGS="\
-L/usr/local/lib \
-L/usr/lib \
-L/usr/lib/x86_64-linux-gnu \
-lOpenImageIO \
-lHalf -lIex -lfreetype -lIlmThread -lImath -lIlmImf -lIlmThread \
-lOpenColorIO \
-lyaml-cpp -ltinyxml \
-lboost_regex -lboost_filesystem -lboost_thread -lboost_system \
-ltiff -lgif -lpng -ljpeg -lz \
-lrt -ldl"

$ go test -v -x --ldflags '-extldflags "-static"' github.com/justinfx/openimageigo
...
/home/justin/src/OpenColorIO/src/core/OCIOYaml.cpp:329: undefined reference to `YAML::Node::begin() const'
...
/home/justin/src/OpenColorIO/build/ext/dist/include/yaml-cpp/nodereadimpl.h:79: undefined reference to `YAML::Node::GetScalar(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&) const'
...
/usr/local/lib/libOpenColorIO.a(OCIOYaml.cpp.o): In function `_FindFromNodeAtIndex':
/home/justin/src/OpenColorIO/build/ext/dist/include/yaml-cpp/nodeutil.h:53: undefined reference to `YAML::Node::FindAtIndex(unsigned long) const'
collect2: ld returned 1 exit status

アップデート #2

アップデート #1 は気にしないでください。OpenColorIOそれは一般的な問題ではなく、特に関連していました。

4

1 に答える 1

7

-l静的ライブラリとリンクする場合、フラグの順序が重要になります。を使用してリンクする-lfoo -lbar -lbazと、 で必要なシンボルlibbar.aは と でのみ検索されlibbar.aますlibbaz.a。目的のシンボルが含まれていてもlibfoo.a、リンカーはそれらを見つけられません。

何が起こっているかというと、各ライブラリに対して、リンカーがアーカイブをアンパックし、以前のものによって参照されるシンボルを含むオブジェクト ファイルを追加します。アーカイブ内の特定のオブジェクト ファイルが必要ない場合、それは無視されます。

修正は、すべてのライブラリが、リンカ フラグで依存するライブラリの前にリストされるようにすることです。依存ループがある場合 (存在してはならない)、ライブラリーを 2 回リストする必要がある場合があります。

于 2014-07-12T04:56:24.987 に答える