简体   繁体   中英

Multiple definition of class methods when building shared library

I'm building a C++ library using SConstruct. If I build the library as a static library, everything works as expected.

However, if I try to build the library as a shared library, I get a huge list of 'multiple definition of' errors when linking.

I don't understand why it is throwing these errors - as far as I can tell, I am not defining these methods multiple times. It does seem that these methods are virtual , which may or may not be a factor.

Relavant files:
ISceneManager.hpp
BasicSceneManager.hpp (inherits from ISceneManager )
BasicSceneManager.cpp

An excerpt of the errors:

build/BasicSceneManager.os: In function `glr::BasicSceneManager::drawAll()':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:81: multiple definition of `glr::BasicSceneManager::drawAll()'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:81: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::setDefaultShaderProgram(glr::shaders::IShaderProgram*)':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:118: multiple definition of `glr::BasicSceneManager::setDefaultShaderProgram(glr::shaders::IShaderProgram*)'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:118: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getModelMatrix() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:128: multiple definition of `glr::BasicSceneManager::getModelMatrix() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:128: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getShaderProgramManager() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:133: multiple definition of `glr::BasicSceneManager::getShaderProgramManager() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:133: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getCamera() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:162: multiple definition of `glr::BasicSceneManager::getCamera() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:162: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::destroyCamera()':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:236: multiple definition of `glr::BasicSceneManager::destroyCamera()'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:236: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getBillboardManager() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:276: multiple definition of `glr::BasicSceneManager::getBillboardManager() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:276: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getModelManager() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:281: multiple definition of `glr::BasicSceneManager::getModelManager() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:281: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getNumSceneNodes() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:311: multiple definition of `glr::BasicSceneManager::getNumSceneNodes() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:311: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getNumLights() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:316: multiple definition of `glr::BasicSceneManager::getNumLights() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:316: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getEnvironmentManager()':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:299: multiple definition of `glr::BasicSceneManager::getEnvironmentManager()'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:299: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getTerrainManager(glr::terrain::IFieldFunction*)':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:287: multiple definition of `glr::BasicSceneManager::getTerrainManager(glr::terrain::IFieldFunction*)'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:287: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getSceneNode(glr::Id) const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:138: multiple definition of `glr::BasicSceneManager::getSceneNode(glr::Id) const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:138: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getLight(glr::Id) const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:167: multiple definition of `glr::BasicSceneManager::getLight(glr::Id) const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:167: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getSceneNode(std::string const&) const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:150: multiple definition of `glr::BasicSceneManager::getSceneNode(std::string const&) const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:150: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getLight(std::string const&) const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:179: multiple definition of `glr::BasicSceneManager::getLight(std::string const&) const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:179: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::getDefaultShaderProgram() const':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:123: multiple definition of `glr::BasicSceneManager::getDefaultShaderProgram() const'
build/BasicSceneManager.os:/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:123: first defined here
build/BasicSceneManager.os: In function `glr::BasicSceneManager::destroySceneNode(glr::ISceneNode*)':
/home/jarrett/projects/icebreakers/glr/src/BasicSceneManager.cpp:221: multiple definition of `glr::BasicSceneManager::destroySceneNode(glr::ISceneNode*)'

Does anyone have any idea why I would get these errors?

Turns out the issue was with SConstruct .

I collect my source files using the Glob command, like so:

source_files = Glob('build/*.cpp')
source_files = source_files + Glob('build/exceptions/*.cpp')
source_files = source_files + Glob('build/gui/*.cpp')
source_files = source_files + Glob('build/gui/cef/*.cpp')
source_files = source_files + Glob('build/models/*.cpp')
source_files = source_files + Glob('build/*.cpp')
source_files = source_files + Glob('build/environment/*.cpp')
source_files = source_files + Glob('build/terrain/*.cpp')
source_files = source_files + Glob('build/terrain/marching_cubes/*.cpp')
source_files = source_files + Glob('build/serialize/*.cpp')
...

env.SharedLibrary('build/glr', source_files, LIBS = libraries, LIBPATH = library_paths)

The problem was that I had a duplicate source_files = source_files + Glob('build/*.cpp') line, which caused certain source files to be included twice in the linker.

Removing that duplicate line, it worked just fine.

This was only an issue with the SharedLibrary builder - it did not happen when using the StaticLibrary builder. This issue is documented here .

Thanks to kec for help diagnosing this issue.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM