我有一个Go库,它为C++ OpenImageIO库(OpenImageiGO)提供绑定。我一直很高兴地通过标准的动态链接构建到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似乎找不到关于boost的参考资料。在链接过程中发生的事情的顺序似乎没有使OpenColorIO或boost符号对OpenImageIO可用,所以我得到了大量的符号错误。
我希望我正在做一些简单而愚蠢的事情,可以在我的构建过程中得到纠正。但是cgo与外部库的静态链接似乎比默认的动态链接方法要复杂得多。
更新#1
詹姆斯-亨斯特里奇给出的答案是正确的,除了最后一次打嗝外,我几乎已经完全长大了。我得到了yaml-cpp的失败引用,这是OpenColorIO所需要的,尽管我似乎有正确的顺序。
下面是我最新的env,我已经完成了所有必须添加的显式静态库的工作:
$ 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相关的,而不是一个一般的问题。
发布于 2014-07-12 04:56:24
当您与静态库链接时,-l标志的顺序很重要。如果使用-lfoo -lbar -lbaz链接,则只在libbar.a和libbaz.a中搜索libbar.a所需的任何符号。即使libfoo.a包含你想要的符号,链接器也找不到它们。
正在发生的情况是,对于每个库,链接器会解压缩归档文件,并添加包含前面任何内容所引用的符号的对象文件。如果不需要存档中的特定对象文件,则忽略它。
修复方法是确保在链接器标志中所依赖的库之前列出每个库。如果有任何依赖循环(不应该存在),则可能需要将库列出两次。
https://stackoverflow.com/questions/24709659
复制相似问题