2016-04-09 102 views
1

我有一個C++,opengl項目。我一直在使用命令行使用此命令編譯:Cmake vs命令行:錯誤Cmake,不在命令行中

g++ `pkg-config --cflags glfw3` -o test test.cpp Third_Party/glError.cpp Third_Party/glUtil.cpp Third_Party/gl_core_4_3.cpp Third_Party/glTexture.cpp Third_Party/glShader.cpp `pkg-config --static --libs glfw3` -std=c++11 

我想用cmake的代替,所以我創建這個文件:

cmake_minimum_required(VERSION 3.2) 
project(openGLTest) 

add_definitions(-std=c++11) 
set(CMAKE_CXX_STANDARD 11) 
set(CMAKE_BUILD_TYPE Release) 

add_executable(openGLTest test.cpp Third_Party/glError.cpp Third_Party/glUtil.cpp Third_Party/gl_core_4_3.cpp Third_Party/glShader.cpp Third_Party/glTexture.cpp) 


find_package(PkgConfig REQUIRED) 

pkg_search_module(GLFW REQUIRED glfw3) 
include_directories(${GLFW_INCLUDE_DIRS}) 
target_link_libraries(openGLTest ${GLFW_STATIC_LIBRARIES}) 

當我編譯和命令行運行測試通,該項目運行良好。但是,當我編譯和運行openGLTest使用cmake,我得到這個錯誤:

terminate called after throwing an instance of 'std::length_error' 
what(): basic_string::_S_create 
Aborted (core dumped) 

爲什麼會出現這種情況,我能做些什麼來解決這個問題?

+1

'CMAKE_BUILD_TYPE'等於* Release *可能會添加額外的編譯/鏈接器標誌。您可能會看到完整的編譯行,使用'make V = 1'。這些附加標誌通常不會中斷正確的**程序,所以遇到問題通常意味着你的程序不正確。例如,它使用一些導致*未定義行爲*的行爲。 – Tsyvarev

+0

這對我來說有點不清楚。你是否說有一個錯誤不會被命令行程序捕獲,而是被cmake程序捕獲? – dan

+0

'有沒有被命令行程序捕獲的錯誤,但被cmake程序捕獲?' - 是的,完全是這樣。更確切的說,這是一些錯誤,它不是通過編譯一些標誌集合來捕獲的,而是被其他一組編譯器標誌捕獲到的。 – Tsyvarev

回答

0

1.- add_definitions(-std = C++ 11),這裏是錯誤的,因爲add_definitions不適用於此目的。請參閱cmake-compile-features的底部示例,以便了解如何啓用propertly C++ 11功能。

2.- 但是當我使用cmake編譯並運行openGLTest時,我沒有看到用cmake創建的運行或測試目標,您是否錯過了CMakeLists.txt中的那部分代碼?

我的解決方案是,完成後CMakeLists.txt和/或從cmake生成清除緩存文件並再次構建。查看配置和構建時間是否輸出錯誤或警告。

+0

不確定你在第二點談論什麼。我發佈的是整個cmake文件 – dan

+0

你指的是哪一點? – Joel

+0

我能弄明白。感謝您的幫助。這是一個代碼相關的問題。自從我使用cmake以來,程序執行的位置發生了變化,這要求我將路徑更改爲我的文本文件。由於我的程序沒有找到正確的文本文件,因此拋出了這個我不認識的錯誤。再次感謝你。 – dan