2012-05-31 2 views
3

Я довольно новичок в разработке linux и испытываю трудности с использованием класса из отдельного файла в моем основном. Ошибка, которую я получаю при создании (после создания makefile с cmake), заключается в том, что система не называет тип, я думаю, что код в системном классе правильный, как если бы я компилировался, не пытаясь создать объект системного класса, у меня нет ошибок, поэтому я думаю, что это может быть связано с тем, как я написал файл CMakeLists.txt.Проблема с Cmake, связанная с классом из отдельного файла C++

Это мой CMakeLists файл:

cmake_minimum_required (VERSION 2.6) 
    project (GL_PROJECT) 

    add_library(system system.cpp) 

    include_directories(${GL_PROJECT_SOURCE_DIR}) 
    link_directories(${GL_PROJECT_BINARY_DIR}) 

     find_package(X11) 

     if(NOT X11_FOUND) 
     message(FATAL_ERROR "Failed to find X11") 
     endif(NOT X11_FOUND) 

     find_package(OpenGL) 
     if(NOT OPENGL_FOUND) 
     message(FATAL_ERROR "Failed to find opengl") 
     endif(NOT OPENGL_FOUND) 

    set(CORELIBS ${OPENGL_LIBRARY} ${X11_LIBRARY}) 

    add_executable(mainEx main.cpp system.cpp) 

    target_link_libraries(mainEx ${CORELIBS} system) 

Я имею в исходном каталоге мой main.cpp, system.h (определение класса) и system.cpp (реализация класса)

В основной:

 #include"system.h" 


     system sys; 

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

     while(1) 
     { 
      sys.Run(); 
     } 

     } 

X11 и GL включает в себя и т.д., в system.h, я думаю, что код там правильно и не вызывает ошибку (как он строит хорошо, если я не попытаться создать экземпляр класса). Я опустил фактический заголовок и реализацию для краткости в надежде, что это будет очевидная ошибка в файле CMakeList, но при необходимости я могу добавить их тоже?

Любые идеи?

Заранее спасибо.

EDIT: Вот ошибки в терминальных

[[email protected] build]$ make 
    Scanning dependencies of target system 
    [ 33%] Building CXX object CMakeFiles/system.dir/system.cpp.o 
    Linking CXX static library libsystem.a 
    [ 33%] Built target system 
    Scanning dependencies of target mainEx 
    [ 66%] Building CXX object CMakeFiles/mainEx.dir/main.cpp.o 
    /home/tims/Code/GL_Project/main.cpp:5:1: error: ‘system’ does not name a type 
    /home/tims/Code/GL_Project/main.cpp: In function ‘int main(int, char**)’: 
    /home/tims/Code/GL_Project/main.cpp:11:3: error: ‘sys’ was not declared in this scope 
    make[2]: *** [CMakeFiles/mainEx.dir/main.cpp.o] Error 1 
    make[1]: *** [CMakeFiles/mainEx.dir/all] Error 2 
    make: *** [all] Error 2 

Edit 2: system.h

#include<stdio.h> 
    #include<stdlib.h> 
    #include<X11/X.h> 
    #include<X11/Xlib.h> 
    #include <GL/gl.h>   
    #include <GL/glx.h>                 
    #include <GL/glu.h>  

    class system { 
    public: 
     system(void); 

     ~system(void); 

     void CreateGLXWindow(); 

     void Run(); 

     //Contains information about X server we will be communicating with 
     Display *display; 

    XEvent xEvent; 

    //Window instance 
    Window rootWindow; 
    XVisualInfo *xVisInfo; 
    XSetWindowAttributes setWindAttrs; 
    XWindowAttributes xWindAttrs; 

    //GL 
    GLXContext context; 
    Colormap cmap; 

    Window window; 
private: 

}; 
+0

Не могли бы вы предоставить генерируемое сообщение об ошибке? Я думаю, что одна проблема может заключаться в том, что вы упоминаете 'system' в' target_link_libraries'. –

+0

Также вы можете использовать 'find_package ( REQUIRED)'. Это автоматически генерирует сообщение об ошибке, если пакет не найден, и вам не нужно 'if (NOT _FOUND) ...'. –

+0

Я отредактировал сформированное сообщение об ошибке в главном сообщении. Я думал, что мне нужно добавить системный класс в качестве библиотеки, а затем связать его с помощью целевых библиотек ссылок? Кроме того - спасибо за отзыв относительно «ТРЕБУЕТСЯ», я сделаю это вместо этого. – timdykes

ответ

6

имя класса system столкновений с функцией int system(const char*), объявленной в stdlib.h, который включен по ваш system.h. Вам нужно либо переименовать класс system, либо переместить его в пространство имен, потому что класс и функция не могут иметь одно и то же имя в C++.

+0

Удивительный! Я переименовал его, и он отлично работает, спасибо! Я думаю, что я буду начинать префикс моих имен или помещать все в пространства имен, чтобы этого не произошло в будущем. Еще раз спасибо! :) Кроме того, я бы проголосовал за ответ, но я недостаточно авторитетен, но heh я отметил его правильно, хотя спасибо – timdykes

Смежные вопросы