为什么应用程序编译但在向类添加新功能之后的连接阶段失败? EclipseCMakeLists.txtMinGW 4.8.1

项目编译和正常应用程序链接:

问题描述:

我的项目是使用以下内置。但加入后,为什么应用程序编译但在向类添加新功能之后的连接阶段失败? <code>Eclipse</code>, <code>CMakeLists.txt</code>, <code>MinGW 4.8.1</code></p> <p>项目编译和正常应用程序链接:

3功能在 'Helper.cpp' 和2个功能 'CamData.cpp',类型为boost :: uBLAS库::矩阵

链接器放弃,和找不到函数(未定义参考错误)虽然它可以编译它们(编译目标文件* .cpp.obj时没有错误)。

代码结构

Main.cpp 
CMain.cpp 
Helper.cpp (Boost::ublas::matrix<double> Fnction1, ...) 
CamData.cpp (Boost::ublas::matrix<double> Funtion4, ...) 

创建,在辅助类的功能如下。在CamData 2个功能也相似类型的:

class Helper{ 
    Helper(); 
    virtual ~Helper(); 
template<typename T> 
using bMatrix = boost::numeric::ublas::matrix<T>; 

bMatrix<double> getmatrixQ(double w, double x, double y, double z); 
bMatrix<double> rotate_x(bMatrix<double> M, double angleinrad); 
bMatrix<double> getTransformationMatrix(bMatrix<double> M, double x, double y, double z); 
}; 

的cmakelist.txt的有关部分如下:

FIND_PACKAGE (Boost REQUIRED COMPONENTS date_time filesystem system) 
INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) 
LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) 

INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src) 
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src/InputParams) 
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../src/Utilities) 

SET(CMAKE_CXX_FLAGS "${warnings}" 
    CACHE STRING "Flags used by the compiler during all build types" FORCE) 
SET(CMAKE_CXX_FLAGS "-Wall -std=c++11") 

ADD_EXECUTABLE(${PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/../src/main.cpp 
           ${CMAKE_CURRENT_SOURCE_DIR}/../src/Utilities/CHelper.cpp 
           ${CMAKE_CURRENT_SOURCE_DIR}/../src/InputParams/CCamData.cpp 
           ${CMAKE_CURRENT_SOURCE_DIR}/../src/CMain.cpp 
           ${CMAKE_CURRENT_SOURCE_DIR}/../src/COutput.cpp 
           ${CMAKE_CURRENT_SOURCE_DIR}/../src/CThreads.cpp) 

TARGET_LINK_LIBRARIES (${PROJECT_NAME} ${Boost_LIBRARIES}) 

注释出功能和thier在主呼叫后.cpp程序可以再次链接。任何想法可能会造成这种情况?

错误日志下面

[100%] Linking CXX executable Project.exe 
CMakeFiles\Project.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x116c): undefined reference to `esg::CHelper::getmatrixQ(double, doubl 
e, double, double)' 
CMakeFiles\Project.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1230): undefined reference to `esg::CHelper::rotate_x(boost::numeric: 
:ublas::matrix<double, boost::numeric::ublas::basic_row_major<unsigned int, int>, boost::numeric::ublas::unbounded_array<double, std::alloca 
tor<double> > >, double)' 
CMakeFiles\Project.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x1344): undefined reference to `esg::CHelper::getTransformationMatrix(
boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<unsigned int, int>, boost::numeric::ublas::unbounded_array<doub 
le, std::allocator<double> > >, double, double, double)' 
CMakeFiles\Project.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x149d): undefined reference to `esg::CCamData::initpinhole(esg::Pinhol 
eIntrinsics&)' 
CMakeFiles\Project.dir/objects.a(main.cpp.obj):main.cpp:(.text+0x15d3): undefined reference to `esg::CCamData::createProjectionMatrix(
boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<unsigned int, int>, boost::numeric::ublas::unbounded_array<doub 
le, std::allocator<double> > >, boost::numeric::ublas::matrix<double, boost::numeric::ublas::basic_row_major<unsigned int, int>, boost::nume 
ric::ublas::unbounded_array<double, std::allocator<double> > >&, long)' 
collect2.exe: error: ld returned 1 exit status 
CMakeFiles\Project.dir\build.make:548: recipe for target 'Project.exe' failed 
mingw32-make.exe[2]: *** [Project.exe] Error 1 
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/Project.dir/all' failed 
mingw32-make.exe[1]: *** [CMakeFiles/Project.dir/all] Error 2 
Makefile:82: recipe for target 'all' failed 
mingw32-make.exe: *** [all] Error 2 
+0

我们需要一个最小的完整示例。请删除标签C++ 11和boost,因为它们是重复的或不相关的。 – usr1234567

+0

现在'最小和完成'是! :-)除了投票下来之外,对解决方案有何看法? – Tomar

+0

根据错误日志,没有用于'add_executable' *的源文件实现给定的函数。请注意,该实现应该使用与声明完全相同的签名和名称空间。 – Tsyvarev

嗯,这里就是为什么我收到的错误,同时连接,而不是在编译时。

在cpp文件的功能进行了声明如下:

Type Function_Name (arguments) 
{ 
    // do something 
} 

,但它应该是这样的:

Type Class_name::Function_Name (arguments) 
{ 
    // do something 
} 

因此,它无法找到他们,同时连接,但可以单独编译它们在cpp文件中。