【发布时间】:2014-05-04 15:40:07
【问题描述】:
我正在使用 SConstruct 构建一个 C++ 库。如果我将库构建为静态库,一切都会按预期工作。
但是,如果我尝试将库构建为共享库,则会在链接时收到大量“多重定义”错误列表。
我不明白为什么会抛出这些错误 - 据我所知,我没有多次定义这些方法。这些方法似乎确实是virtual,这可能是也可能不是一个因素。
相关文件:
ISceneManager.hpp
BasicSceneManager.hpp(继承自ISceneManager)
BasicSceneManager.cpp
错误摘录:
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*)'
有人知道我为什么会收到这些错误吗?
【问题讨论】:
-
这更像是一个构建工具/流程问题,而不是 C++ 问题。链接器不会说谎,所以很明显你必须有多个定义。我要做的是查看构建您的 .so 的最终链接。那可能有一堆.o。在每个 .o 上运行 nm,并找到多重定义符号的来源。通过 c++filt 运行输出以 demangle.
-
另一方面,这可能是由于使用 SConstruct 时的常见错误导致的常见问题,因此您最好尝试他们的支持机制。
-
太棒了,我不知道
nm。我会开始查看它 - 谢谢@kec! -
于是我查看了每个
.os文件,BasicSceneManager.os中只有一个定义。我会调查一个可能的SConstruct问题。 -
你知道
find怎么用吗?如果是这样,您可以使用find在一个命令行中在您计算机上的everything 上运行nm。