-1

私のプロジェクトは以下を使用して構築されています: Eclipse, CMakeLists.txt, MinGW 4.8.1

プロジェクトが正常にコンパイルされ、アプリケーションがリンクされます。しかし、追加した後、

タイプ boost::ublas::matrix の 'Helper.cpp' の 3 つの関数と 'CamData.cpp' の 2 つの関数

リンカーはあきらめ、関数を見つけることができなくなります(未定義参照エラー)が、関数をコンパイルできます (オブジェクト ファイル *.cpp.obj のコンパイル中にエラーは発生しません)。

コード構造

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

作成した Helper クラスの関数は以下の通りです。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})

main.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  
4

1 に答える 1

0

さて、コンパイル中ではなくリンク中にエラーを受け取った理由は次のとおりです。

cpp ファイルの関数は次のように宣言されています。

Type Function_Name (arguments)
{
  // do something
}   

しかし、それは次のようになっているはずです:

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

したがって、リンク中にそれらを見つけることができませんでしたが、cppファイル内で個別にコンパイルできました。

于 2016-09-12T19:39:05.997 に答える