尝试使用 osgText 和 freetype link 时出错
Error trying to link with osgText and freetype
我已经检查了几十个关于这个的网页和配置。
我很绝望,因为我真的需要尽快使用这个功能。
这些是我的设置:
- 语言:C++
- 库:OpenSceneGraph (OSG) v3.2.0
- OS:Xubuntu 14.04(在 VMWare Player 虚拟机上)
我正在编译 "OpenSceneGraph 3.0 - Beginner's Guide" 一书中的一个示例,第 297-299 页,关于在 OSG 上使用文本,这需要一个额外的插件,freetype (http://www.freetype.org/),已安装。
示例编译正确。
我想我拥有所有必需的包含文件和库。
问题出现在link阶段。它总是给我这个错误:
/usr/bin/ld: CMakeFiles/osg_demos.dir/osg_demos.cpp.o: undefined reference to symbol '_ZN7osgText12readFontFileERKSsPKN5osgDB7OptionsE'
//usr/lib/libosgText.so.99: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [osg_demos] Error 1
make[1]: *** [CMakeFiles/osg_demos.dir/all] Error 2
make: *** [all] Error 2
我检查过我有文件:
- "/usr/lib/libosgText.so.99" 这是实际 lib 文件的 link:
"libosgText.so.3.2.0".
- "/usr/lib/osgPlugins-3.2.0/osgdb_freetype.so"
osgText 库的外部依赖。
我运行没主意了。 :(
有人可以帮助我吗?
我的问题到此为止,但如果您想查看我的文件,请在下面找到它们。
导致此问题的代码:
osgText::Text* createText( const osg::Vec3& pos,
const std::string& content, float size ) {
osg::ref_ptr<osgText::Font> g_font = osgText::readFontFile("arial.ttf");
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( g_font.get() );
text->setCharacterSize( size );
text->setAxisAlignment( osgText::TextBase::XY_PLANE );
text->setPosition( pos );
text->setText( content );
return text.release();
}
这些是我正在使用的特定于 osgText 操作的包含文件,除了我在我的项目中已经需要的所有其他文件:
#include <osg/Camera>
#include <osgText/TextBase>
#include <osgText/Font>
#include <osgText/Text>
这是我的 "CMakeLists.txt" 文件:
cmake_minimum_required( VERSION 2.6 )
project( OSG_DEMOS )
find_package( OpenThreads )
find_package( osg )
find_package( osgDB )
find_package( osgGA )
find_package( osgUtil )
find_package( osgViewer )
find_package( osgText ) # Needed for demo: writeText()
find_package( osgShadow ) # Needed for demo: writeText()
find_package( osgParticle ) # Needed for demo: writeText()
find_package( osgFX ) # Needed for demo: writeText()
find_package(PCL 1.6 COMPONENTS)
set(CMAKE_CXX_FLAGS "-g -Wno-deprecated")
macro( config_project PROJNAME LIBNAME )
include_directories( ${${LIBNAME}_INCLUDE_DIR} )
target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARIES} )
endmacro()
add_executable(osg_demos osg_demos.cpp)
config_project(osg_demos OPENTHREADS )
config_project(osg_demos OSG )
config_project(osg_demos OSGDB )
config_project(osg_demos OSGGA )
config_project(osg_demos OSGUTIL )
config_project(osg_demos OSGVIEWER )
config_project(osg_demos osgText )
config_project(osg_demos osgShadow )
config_project(osg_demos osgParticle )
config_project(osg_demos osgFX )
问题出在 "CMakeLists.txt" 文件上。
显然,config_project 宏需要 所有大写 字母。我不完全明白为什么。
为了使项目 link 正确,我在该文件的最后四行将对库名称的引用切换为大写,例如:
- config_project(osg_demos OSGTEXT)
而不是:
- config_project(osg_demos osgText )
因为这个真是一场噩梦...
我已经检查了几十个关于这个的网页和配置。 我很绝望,因为我真的需要尽快使用这个功能。
这些是我的设置:
- 语言:C++
- 库:OpenSceneGraph (OSG) v3.2.0
- OS:Xubuntu 14.04(在 VMWare Player 虚拟机上)
我正在编译 "OpenSceneGraph 3.0 - Beginner's Guide" 一书中的一个示例,第 297-299 页,关于在 OSG 上使用文本,这需要一个额外的插件,freetype (http://www.freetype.org/),已安装。
示例编译正确。 我想我拥有所有必需的包含文件和库。
问题出现在link阶段。它总是给我这个错误:
/usr/bin/ld: CMakeFiles/osg_demos.dir/osg_demos.cpp.o: undefined reference to symbol '_ZN7osgText12readFontFileERKSsPKN5osgDB7OptionsE'
//usr/lib/libosgText.so.99: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
make[2]: *** [osg_demos] Error 1
make[1]: *** [CMakeFiles/osg_demos.dir/all] Error 2
make: *** [all] Error 2
我检查过我有文件:
- "/usr/lib/libosgText.so.99" 这是实际 lib 文件的 link: "libosgText.so.3.2.0".
- "/usr/lib/osgPlugins-3.2.0/osgdb_freetype.so" osgText 库的外部依赖。
我运行没主意了。 :(
有人可以帮助我吗?
我的问题到此为止,但如果您想查看我的文件,请在下面找到它们。
导致此问题的代码:
osgText::Text* createText( const osg::Vec3& pos,
const std::string& content, float size ) {
osg::ref_ptr<osgText::Font> g_font = osgText::readFontFile("arial.ttf");
osg::ref_ptr<osgText::Text> text = new osgText::Text;
text->setFont( g_font.get() );
text->setCharacterSize( size );
text->setAxisAlignment( osgText::TextBase::XY_PLANE );
text->setPosition( pos );
text->setText( content );
return text.release();
}
这些是我正在使用的特定于 osgText 操作的包含文件,除了我在我的项目中已经需要的所有其他文件:
#include <osg/Camera>
#include <osgText/TextBase>
#include <osgText/Font>
#include <osgText/Text>
这是我的 "CMakeLists.txt" 文件:
cmake_minimum_required( VERSION 2.6 )
project( OSG_DEMOS )
find_package( OpenThreads )
find_package( osg )
find_package( osgDB )
find_package( osgGA )
find_package( osgUtil )
find_package( osgViewer )
find_package( osgText ) # Needed for demo: writeText()
find_package( osgShadow ) # Needed for demo: writeText()
find_package( osgParticle ) # Needed for demo: writeText()
find_package( osgFX ) # Needed for demo: writeText()
find_package(PCL 1.6 COMPONENTS)
set(CMAKE_CXX_FLAGS "-g -Wno-deprecated")
macro( config_project PROJNAME LIBNAME )
include_directories( ${${LIBNAME}_INCLUDE_DIR} )
target_link_libraries( ${PROJNAME} ${${LIBNAME}_LIBRARIES} )
endmacro()
add_executable(osg_demos osg_demos.cpp)
config_project(osg_demos OPENTHREADS )
config_project(osg_demos OSG )
config_project(osg_demos OSGDB )
config_project(osg_demos OSGGA )
config_project(osg_demos OSGUTIL )
config_project(osg_demos OSGVIEWER )
config_project(osg_demos osgText )
config_project(osg_demos osgShadow )
config_project(osg_demos osgParticle )
config_project(osg_demos osgFX )
问题出在 "CMakeLists.txt" 文件上。 显然,config_project 宏需要 所有大写 字母。我不完全明白为什么。 为了使项目 link 正确,我在该文件的最后四行将对库名称的引用切换为大写,例如:
- config_project(osg_demos OSGTEXT)
而不是:
- config_project(osg_demos osgText )
因为这个真是一场噩梦...