CMake 没有正确链接?

Posted

技术标签:

【中文标题】CMake 没有正确链接?【英文标题】:CMake doesn't link correctly? 【发布时间】:2012-11-19 02:07:04 【问题描述】:

我目前正在尝试调试一个程序,该程序已确定不运行。我想这个错误很简单,我对 c++ 和使用 cmake 真的很陌生。

这是错误信息:

Scanning dependencies of target viewer

[ 25%] Building CXX object CMakeFiles/viewer.dir/Main.cpp.o
[ 50%] Building CXX object CMakeFiles/viewer.dir/TriangleMesh.cpp.o
[ 75%] Building CXX object CMakeFiles/viewer.dir/Camera.cpp.o
[100%] Building CXX object CMakeFiles/viewer.dir/MainWindow.cpp.o
Linking CXX executable viewer
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mousePressed(int, int, int, int): error: undefined reference
to 'MainWindow::mouse_button'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mousePressed(int, int, int, int): error: undefined reference
to 'MainWindow::mouse_state'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::render(): error: undefined reference to 'MainWindow::cam'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::render(): error: undefined reference to 'MainWindow::mesh'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::mouse_button'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::old_y'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::old_x'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::cam'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::cam'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::mouse_button'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::old_x'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::old_y'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::mouse_button'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::mouseMove(int, int): error: undefined reference to
'MainWindow::cam'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::MainWindow(Camera*, int, char**): error: undefined reference
to 'MainWindow::old_x'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::MainWindow(Camera*, int, char**): error: undefined reference
to 'MainWindow::old_y'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::MainWindow(Camera*, int, char**): error: undefined reference
to 'MainWindow::mesh'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::MainWindow(Camera*, int, char**): error: undefined reference
to 'MainWindow::mesh'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::MainWindow(Camera*, int, char**): error: undefined reference
to 'MainWindow::mesh'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::getInstance(Camera*, int, char**): error: undefined reference
to 'MainWindow::instance'
CMakeFiles/viewer.dir/MainWindow.cpp.o:MainWindow.cpp:function
MainWindow::getInstance(Camera*, int, char**): error: undefined reference
to 'MainWindow::instance'
collect2: ld returned 1 exit status
make[2]: *** [viewer] Error 1
make[1]: *** [CMakeFiles/viewer.dir/all] Error 2
make: *** [all] Error 2 

所以,代码编译得很好,它只是不能真正链接 4 个源文件之一..

编辑:

这是 MainWindow.hpp 的要点

class MainWindow

        private:
                MainWindow() 
                MainWindow(const MainWindow&) 
                MainWindow(Camera *cam, int argc, char* argv[]);
                static MainWindow *instance;
                static Camera *cam;
                static TriangleMesh mesh;
                static int old_x;
                static int old_y;
                static int mouse_button;
                static int mouse_state;
                static void mousePressed(int button, int state, int x, int y);
                static void initGlut(int argc, char* argv[]);
                static void initCallbacks();
                static void render();
                static void reshape(int w, int h);
                static void keyPressed(unsigned char key, int x, int y);
                static void mouseMove(int x, int y);

        public:
                static MainWindow* getInstance(Camera *cam, int argc, char* argv[]);
                static void setCamera(Camera* cam);
                static void setMesh(TriangleMesh* mesh);
                static void destroy();
;

【问题讨论】:

MainWindow那些成员吗?它们是如何声明的?它们是如何定义的? 这是我首先检查的。但他们肯定会这样做,而且我认为包含的内容也很好。问题是,所有目标文件都是很好地编译的,所以我猜它们也被发现了。只是不是通过链接器。编辑:添加声明。 【参考方案1】:

如果你有静态成员变量,它们也需要定义,而不仅仅是声明

在头文件中:

class Foo

    ...

    // This declares a static member variable
    static int static_member_variable;

    ...
;

在源文件中:

// This defines the variable
int Foo::static_member_variable;

【讨论】:

你的意思是,为了在 .cpp 文件中定义 old_x,写 old_x = 0; 是不够的,但是 int MainWindow::old_x = 0; @ArneRecknagel 是的,否则你只需声明一个普通的全局变量。 非常感谢 - 我永远不会猜到静态成员变量是我的问题。我需要一些时间来弄清楚必须将声明放在源文件的顶部,但是现在已经完成了,一切都可以正常工作。 =)

以上是关于CMake 没有正确链接?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 cmake 正确链接库?

使用 cmake 正确链接库

如何在 cmake 中正确链接库?

CMake系列:关闭链接警告设置UNICODE

CMake系列:关闭链接警告设置UNICODE

CMAKE将动态库链接到模块,但不显示为链接依赖