2015-11-27 8 views
1

У меня возникла проблема с созданием проекта 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:

Наблюдения

  • Переупорядочивание библиотеки на линии компилятор не работает.
+1

Ошибки компоновщика C++ в OS X, где единственными недостающими символами являются те, которые содержат 'std :: __ 1 :: basic_string'? Это очень похоже на несовместимость стандартной библиотеки C++. Убедитесь, что и ваша библиотека, и приложение построены на основе libstdC++ или libC++ (и это также означает, что вы не можете использовать g ++ для компиляции одного и clang ++ для компиляции другого). – neverpanic

+0

Хороший улов. Я копаюсь в спецификации portfile для OSG на MacPorts, чтобы выяснить, какой компилятор они используют. Поскольку MacPorts вручную создает каждый пакет на вашем компьютере, это определенно дает такое доверие. Я уточню, как только я сделаю больше исследований. – msmith81886

+0

MacPorts всегда пытается использовать системный компилятор по умолчанию и следует за выбором стандартной библиотеки C++ по умолчанию. Поэтому, если «Portfile» ничего не делает (и это не похоже), это будет «clang ++», используя 'libC++' на что-нибудь> = 10.9. – neverpanic

ответ

1

Хм, я могу воспроизвести вашу проблему. Кажется libosgDB.dylib, установленное OpenSceneGraph порт связи MacPorts' против libstdC++:

$ otool -L /opt/local/lib/libosgDB.dylib 
/opt/local/lib/libosgDB.dylib: 
    /opt/local/lib/libosgDB.100.dylib (compatibility version 100.0.0, current version 3.2.1) 
    /opt/local/lib/libosgUtil.100.dylib (compatibility version 100.0.0, current version 3.2.1) 
    /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 157.0.0) 
    /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0) 
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1225.1.1) 
    /opt/local/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.8) 
    /System/Library/Frameworks/OpenGL.framework/Versions/A/OpenGL (compatibility version 1.0.0, current version 1.0.0) 
    /opt/local/lib/libosg.100.dylib (compatibility version 100.0.0, current version 3.2.1) 
    /opt/local/lib/libOpenThreads.20.dylib (compatibility version 20.0.0, current version 3.2.1) 
    /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.1.0) 
    /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1255.1.0) 
    /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 728.4.0) 

Я считаю, что это будет ошибка порта OpenSceneGraph. Пожалуйста, напишите билет, чтобы зафиксировать это. Между тем, используйте -stdlib=libstdc++ в командной строке компилятора, чтобы связать ваш пример. Обратите внимание, что это означает, что вы не можете использовать возможности C++ 11.