嗨:在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包的方式?
我正在尝试在后台线程中加载纹理,以帮助加快我的应用程序.
我们使用的堆栈是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)