3

なぜこれが起こっているのか分かりません。私が得るエラーは次のとおりです。

Error   2   error LNK2019: unresolved external symbol "public: int __thiscall Graphics::GLMatrix::getColumnSize(void)" (?getColumnSize@GLMatrix@Graphics@@QAEHXZ) referenced in function _SDL_main  C:\Users\holland\Documents\code\c++\projects\OpenGL_01\OpenGL_01\main.obj
Error   3   error LNK2019: unresolved external symbol "public: int __thiscall Graphics::GLMatrix::getRowSize(void)" (?getRowSize@GLMatrix@Graphics@@QAEHXZ) referenced in function _SDL_main    C:\Users\holland\Documents\code\c++\projects\OpenGL_01\OpenGL_01\main.obj
Error   4   error LNK1120: 2 unresolved externals   C:\Users\holland\Documents\code\c++\projects\OpenGL_01\Debug\OpenGL_01.exe  

リンクされていないのは、私のMatrixクラスの関数ですgetRowSize()getColumnSize()私は何が間違っているのですか?

だから、私はここで何が間違っているのですか?私は検索してきました...あらゆる方法で検索しています。

コード

ヘッダーファイル:

#ifndef GLMATRIX_H
#define GLMATRIX_H

#pragma once

#include <array>


namespace Graphics {

    class GLMatrix
    {
    public:
        GLMatrix(int sizeX, int sizeY);
        ~GLMatrix();
        void allocMatrix();
        void addColumnI(int row, int column, long item);
        void revertRowsByColumns(); /*changes the formula of r * c to c * r*/
        GLMatrix &operator *(float scalar); /*multiply by scalar*/
        inline int getRowSize();
        inline int getColumnSize();
    private:
        int _sizeX, _sizeY;
        long** _pArray;
    };

}

#endif //GLMATRIX_H

ソース:

#include "GLMatrix.h"

namespace Graphics {

    GLMatrix::GLMatrix(int sizeX, int sizeY)
    {
        _sizeX = sizeX; 
        _sizeY = sizeY;
    }

    GLMatrix::~GLMatrix()
    {
        delete _pArray;
    }

    void GLMatrix::addColumnI(int row, int column, long item) {

    }

    inline int GLMatrix::getRowSize() {
        return _sizeX;
    }

    inline int GLMatrix::getColumnSize() {
        return _sizeY;
    }

    void GLMatrix::allocMatrix() {

        _pArray = new long*[_sizeX];

        for (int i = 0; i < _sizeX; ++i) {          
            _pArray[i] = new long[_sizeY];
        }

    }

    void GLMatrix::revertRowsByColumns() {

        long** columns = new long*[_sizeY];

        for (int col = 0; col < _sizeY; ++col) {
            columns[col] = new long[_sizeX];
            memmove(
                columns + col, 
                _pArray[_sizeX - col], 
                sizeof(_sizeX) - sizeof(col)
            );
        }   
    }

}

主要:

#include <SDL.h>
#include "GLMatrix.h"


int main(int argc, char* argv[]) {

    //SDL_Init(SDL_INIT_EVERYTHING);

    //matrix test

    Graphics::GLMatrix* matrix = new Graphics::GLMatrix(3, 3);

    int num_rows = matrix->getRowSize();
    int num_columns = matrix->getColumnSize();
    for (int row = 0; row < num_rows; ++row) {

    }

    //SDL_Quit();

    delete matrix;

    return 0;
}
4

4 に答える 4

2

インライン関数をヘッダーファイルで宣言する必要があるという一般的な知識は、もはや真実ではありません。数年以来、ほとんどのコンパイラは、リンク時間最適化(gcc)またはリンク時間コード生成(VC)と呼ばれる機能を実装しており、インライン関数に関する重要な情報を(とりわけ)保存して、リンカーがすべてのオブジェクトファイルを「1つの大きな幸せ」と見なせるようにします。翻訳ユニット」。したがって、リンカは、cppファイルに配置した関数をインライン化できます。

関連リンク: http: //msdn.microsoft.com/en-us/library/xbf3tbeh.aspx http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html(-fltoを検索)

編集:それは私が以前に書いたものから明らかに理解されていませんでした。この機能は、怠惰なプログラマーが各翻訳単位でインライン関数を宣言するのを防ぐために設計されたものではありません。しかし、それはあなたに問題を引き起こす可能性のあるこの副産物を与えます。ヘッダーファイルでインライン関数を宣言してください。

于 2012-06-17T16:28:10.350 に答える
1

インライン関数はヘッダーファイルで定義する必要があります。(より具体的には、定義は、それが使用されるすべての翻訳単位で表示される必要があります。)

于 2011-12-23T02:47:05.160 に答える
1

1.翻訳ユニットは、含まれているファイルと一緒の単一のソースファイル(この場合は「ソース」と「メイン」)です。

2.インライン関数

C ++ 11、§3.2/ 3

「[...]インライン関数は、それがodrで使用されるすべての変換単位で定義されるものとします。[...]」

§7.1.2/4

インライン関数は、それがodrで使用されるすべての変換単位で定義され、すべての場合でまったく同じ定義を持つ必要があります(3.2)。[...]

「ソース」翻訳単位には、との定義がgetRowSizeありgetColumnSizeます。あなたの「メイン」翻訳ユニットは持っていません!コンパイラがそれをチェックする必要がないため、これは未定義の動作です。

LTCG / LTO

ウラジミールの答えの一部は正しいです。リンク時の最適化(またはリンク時のコード生成)があります。しかし、それは怠惰なプログラマーがインライン関数の関数定義を保存するのを助けるという目的には役立ちません。

LTCG / LTOは、すべての関数を一度にコンパイラーに表示するために実行されます。コンパイラーは、通常の状況では表示されない関数をインライン化することを決定する場合があります。宣言された関数はinline、定義ごとに、使用されるすべてのポイントでコンパイラーに表示される必要があります。したがって、LTCG / LTOは、欠落しているインラインリンクエラーを解決するために必要ではありません(また、その目的で悪用されるべきではありません)。


明確にするために、これは古い質問であるという事実をよく知っていますが、まだ正しく答えられておらず、私はただそれを乗り越えました。

于 2013-07-17T06:34:27.557 に答える
1

Visual Studio2019のライブラリのインライン関数でこのリンクエラーの問題にも直面していました。[C/C ++プロパティの言語]タブで[参照されていないコードとデータを削除]プロパティを[いいえ]に設定し、リンクエラーを解決しました。

于 2021-04-14T16:59:38.963 に答える