У меня возникла проблема с созданием проекта OpenSceneGraph для правильной связи на моем Mac. Я установил его через macports, и я получил osgviewer
и другие программы osg для работы, то есть он был скомпилирован и связан каким-то образом. Код является частью более крупного проекта, однако я выделил код OSG до голых костей, чтобы изолировать мои проблемы. Сначала я подумал, что это проблема CMake, поэтому я создал Makefile, чтобы попытаться изолировать его. Это не имело никакого значения.Ошибка компоновщика OpenSceneGraph на Mac с Macports
Вот пример кода.
// OpenSceneGraph Libraries
#include <osg/Geode>
#include <osg/Group>
#include <osg/ShapeDrawable>
#include <osgUtil/Optimizer>
#include <osgUtil/SmoothingVisitor>
#include <osgUtil/Simplifier>
#include <osg/Node>
#include <osg/Texture1D>
#include <osg/Texture2D>
#include <osg/TexGen>
#include <osg/Material>
#include <osgViewer/Viewer>
#include <osgDB/Registry>
#include <osgDB/WriteFile>
#include <osgDB/ReadFile>
#include <osgSim/Version>
#include <osgFX/Version>
#include <osgTerrain/Version>
#include <osgVolume/Version>
// C++ Libraries
#include <iostream>
#include <string>
/**
* @brief Main Application
*/
int main(int argc, char* argv[])
{
// Define Write Options
osgDB::Options* write_options = new osgDB::Options("WriteImageHint=IncludeData Compressor=zlib");
// Create the Root Nodes
osg::ref_ptr<osg::Group> root_node(new osg::Group());
// Write the Node File
osgDB::writeNodeFile(*root_node.get(),
"output.osgb",
write_options);
// Return
return 0;
}
Вот код Makefile. Я добавил больше, чем нужно, чтобы ничего не сказалось.
OSG_LIBS=-lOpenThreads -losgDB -losg -losgUtil -losgTerrain
LIBS=-L/opt/local/lib $(OSG_LIBS)
INCL=-I/opt/local/include
CPP=clang++
foo: foo.cpp
$(CPP) foo.cpp $(LIBS) $(INCL)
Вот выход make с VERBOSE = 1 по конкретной команде.
$ make VERBOSE=1
clang++ foo.cpp -L/opt/local/lib -lOpenThreads -losgDB -losg -losgUtil -losgTerrain -I/opt/local/include
Undefined symbols for architecture x86_64:
"osgDB::writeNodeFile(osg::Node const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, osgDB::Options const*)", referenced from:
_main in foo-2c45f6.o
"osgDB::Options::parsePluginStringData(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, char, char)", referenced from:
osgDB::Options::Options(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) in foo-2c45f6.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [foo] Error 1
Я бежал otool
и другие приложения против общих библиотек, чтобы попытаться найти где неопределенная ссылка. Я знаю, когда я запускаю nm
, символ для обоих этих методов находится в libosgDB.dylib
, но связь с ним не работает.
Я начинаю компилировать OpenSceneGraph из исходного кода, но это также создает ошибки компиляции самостоятельно. У меня впереди длинный бой. Большое вам спасибо за ваше время.
Update:
Наблюдения
- Переупорядочивание библиотеки на линии компилятор не работает.
Ошибки компоновщика C++ в OS X, где единственными недостающими символами являются те, которые содержат 'std :: __ 1 :: basic_string'? Это очень похоже на несовместимость стандартной библиотеки C++. Убедитесь, что и ваша библиотека, и приложение построены на основе libstdC++ или libC++ (и это также означает, что вы не можете использовать g ++ для компиляции одного и clang ++ для компиляции другого). – neverpanic
Хороший улов. Я копаюсь в спецификации portfile для OSG на MacPorts, чтобы выяснить, какой компилятор они используют. Поскольку MacPorts вручную создает каждый пакет на вашем компьютере, это определенно дает такое доверие. Я уточню, как только я сделаю больше исследований. – msmith81886
MacPorts всегда пытается использовать системный компилятор по умолчанию и следует за выбором стандартной библиотеки C++ по умолчанию. Поэтому, если «Portfile» ничего не делает (и это не похоже), это будет «clang ++», используя 'libC++' на что-нибудь> = 10.9. – neverpanic