小编Joh*_*ton的帖子

链接Visual Studio 2013中的NuGet库

嗨:在Visual Studio 2012 Professional,Update 4中,我可以通过创建一个新的Visual C++项目(使用空白模板)并进入NuGet包管理器控制台并输入以下内容,轻松地创建一个新的OpenGL项目:

Install-Package freeglut
Install-Package glew
Install-Package glm
Run Code Online (Sandbox Code Playgroud)

获取freeglut,glew和glm(仅限标题的数学库)的库.

然后我可以创建一个利用这些库的简单示例:( 完整示例)

#include <GL/freeglut.h>
#include <GL/glew.h>
#include <glm/glm.hpp>

int main(int argc, char *argv[]) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

然后在没有任何进一步配置的情况下,我可以点击大绿色构建按钮,所有内容都编译,链接和运行(在NuGet包中找到可再发行的.dll)并且工作正常.

在Visual Studio 2013中,相同的方法不起作用:VS2013抱怨它找不到freeglut.lib:

链接:致命错误LNK1104:无法打开文件'freeglut.lib'

如果我手动编辑库路径并将DLL复制到构建输出目录,我可以让项目编译,但这似乎非常不方便.

有趣的是,即使没有设置或更改任何内容,Visual Studio似乎足够聪明,可以查找 freeglut.lib,但它似乎不知道在哪里可以找到它.

这是一个每包难度,还是VS2013改变了Visual Studio处理NuGet包的方式?

c++ freeglut nuget visual-studio-2012 visual-studio-2013

6
推荐指数
1
解决办法
7099
查看次数

使用glGetString()和linux下的pthreads进行分段错误

我正在尝试在后台线程中加载纹理,以帮助加快我的应用程序.

我们使用的堆栈是Linux上的C/C++,使用gcc进行编译.我们正在使用OpenGL,GLUT和GLEW.我们一直在使用libSOIL进行纹理加载.

最终,使用libSOIL启动纹理加载失败,因为它遇到导致段错误的glGetString()调用.为了缩小问题范围,我编写了一个非常简单的OpenGL应用程序来重现行为.下面的代码示例不应该"做任何事情",但它也不应该是段错误.如果我知道它为什么会这样做,我理论上可以重新修改libSOIL,以便它在一个pthreaded环境中运行.

void *glPthreadTest( void* arg ) {

  glGetString( GL_EXTENSIONS ); //SIGSEGV
  return NULL;

}

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

  glutInit( &argc, argv );
  glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );

  glewInit();

  glGetString( GL_EXTENSIONS ); // Does not cause SIGSEGV 

  pthread_t id;
  if (pthread_create( &id, NULL, glPthreadTest, (void*)NULL ) != 0)
    fprintf( stderr, "phtread_create glPthreadTest failed.\n" );

  glutMainLoop();
  return EXIT_SUCCESS;

}
Run Code Online (Sandbox Code Playgroud)

来自gdb的此应用程序的示例堆栈跟踪如下所示:

#0  0x00000038492f86e9 in glGetString () from /usr/lib64/nvidia/libGL.so.1
No symbol table info available.
#1  0x0000000000404425 …
Run Code Online (Sandbox Code Playgroud)

linux opengl glut glew pthreads

4
推荐指数
1
解决办法
1622
查看次数